我目前尝试通过Socket-Connection发送大消息。我的消息有大约1.3 MB的东西。这是我的代码:
public void send(String message) throws IOException {
byte[] bytes = message.getBytes(encoding);
ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
while (socketChannel.write(byteBuffer) > 0) {
}
}
在客户端的另一端是一个Sever,它只打印出读取的数据。在大约260 kB之后,它总是停止读取。在我看来,一些缓冲区已满? 我该怎么做才能使这个Socket-Connection正常工作?
答案 0 :(得分:1)
while (socketChannel.write(byteBuffer) > 0) {
}
如果您不处于阻塞模式,则只要本地套接字发送缓冲区填满,此循环就会终止,这会导致write()
返回零。
简单但质量较差的修复方法是将循环条件从>
更改为>=
。但是,如果write()
返回零,您应该使用Selector
和OP_WRITE
来检测通道何时再次可写。
答案 1 :(得分:0)
我认为最好为你的ByteBuffer分配足够的空间并在发送之前将其翻转,因为你想从现在开始读取它。也许这适合你。
final byte[] bytesToSend = message.getBytes(encoding);
ByteBuffer buffer = ByteBuffer.allocate(bytesToSend.length);
buffer.clear();
buffer.put(bytesToSend);
buffer.flip();
while (buffer.hasRemaining()) {
try {
socketChannel.write(buf);
} catch (IOException e) {
e.printStackTrace();
}
}