Мне удалось воспроизвести ситуацию, которая может быть похожа на вашу. Я думаю, по иронии судьбы, ваш получатель потребляет данные быстрее, чем вы пишете.
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);
}
}
Если вы запустите указанный выше сервер, а затем попытаетесь описанным выше клиентом попытаться записать 10 блоков данных размером 128 КБ, вы увидите, что каждая операция записи записывает весь буфер без блокировки. Однако, если вы измените указанный выше сервер, чтобы ничего не читать из соединения, вы увидите, что только первая операция записи на клиенте будет записывать 128 КБ, тогда как все последующие записи будут возвращать 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
...