我正在使用Java7的nio2 AsynchronousSocketChannel通过CompletionHandlers执行读写操作。首先,我想知道写操作是否保证将ByteBuffer完全写出。如果是部分写入,使用CompletionHandler可以完全写出ByteBuffer。也许使用递归?
阅读也是如此。我保证完全从AsynchronousSocketchannel中读取整个消息,或者它也可以是部分读取。如果是这样的话,再次使用CompletionHandlers,我如何编写一个执行完全读取操作的处理程序。
先谢谢你,弗朗西斯
发布于 2016-06-21 18:21:19
任何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
}
});https://stackoverflow.com/questions/37932919
复制相似问题