我使用java 7的nio2 AsynchronousSocketChannel来使用CompletionHandlers执行读写操作。首先,我想知道是否保证写操作完全写出ByteBuffer。如果它是部分写入,则使用CompletionHandler可以完全写出ByteBuffer。也许使用递归?
同样适合阅读。我保证完全从AsynchronousSocketchannel读取整个消息,或者它也可以是部分读取。如果是这样,再次使用CompletionHandlers我怎么能编写一个可以执行完整读操作的处理程序。
提前感谢你 弗朗西斯
答案 0 :(得分:1)
read
和write
操作都不能保证写入或读取缓冲区的完整内容。它们只是读取或写入底层套接字中可用于读取操作的任何内容,或者操作系统可以将多少放入缓冲区以进行写入操作。
要可靠地执行完全读/写操作,只要缓冲区中有一些剩余空间/字节,您需要重复read
/ write
操作:
ByteBuffer buffer = ByteBuffer.allocate(full_size_I_do_expect);
channel.read(buffer, null,
new CompletionHandler() {
@Override
public void completed(Integer result, Object attachment) {
if (result < 0) {
// handle unexpected connection close
}
else if (buffer.remaining() > 0) {
// repeat the call with the same CompletionHandler
channel.read(buffer, null, this);
}
else {
// got all data, process the buffer
}
}
@Override
public void failed(Throwable e, Object attachment) {
// handle the failure
}
});