あなたの状況に似ているかもしれない状況を再現することができました。皮肉なことに、受信者は、あなたがデータを書き込むよりも速くデータを消費していると思います。
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class MyServer {
public static void main(String[] args) throws Exception {
final ServerSocket ss = new ServerSocket(12345);
final Socket cs = ss.accept();
System.out.println("Accepted connection");
final InputStream in = cs.getInputStream();
final byte[] tmp = new byte[64 * 1024];
while (in.read(tmp) != -1);
Thread.sleep(100000);
}
}
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
public class MyNioClient {
public static void main(String[] args) throws Exception {
final SocketChannel s = SocketChannel.open();
s.configureBlocking(false);
s.connect(new InetSocketAddress("localhost", 12345));
s.finishConnect();
final ByteBuffer buf = ByteBuffer.allocate(128 * 1024);
for (int i = 0; i < 10; i++) {
System.out.println("to write: " + buf.remaining() + ", written: " + s.write(buf));
buf.position(0);
}
Thread.sleep(100000);
}
}
上記のサーバーを実行してから、上記のクライアントに 128 kB のデータの 10 チャンクの書き込みを試行させると、すべての書き込み操作がブロックされることなくバッファー全体を書き込むことがわかります。ただし、接続から何も読み取らないように上記のサーバーを変更すると、クライアントでの最初の書き込み操作のみが 128 kB を書き込み、その後のすべての書き込みでは が返されることがわかります0
。
サーバーが接続から読み取っている場合の出力:
to write: 131072, written: 131072
to write: 131072, written: 131072
to write: 131072, written: 131072
...
サーバーが接続から読み取っていない場合の出力:
to write: 131072, written: 131072
to write: 131072, written: 0
to write: 131072, written: 0
...