使用CompletionHandler

时间:2016-06-20 22:37:10

标签: java sockets nio

我使用java 7的nio2 AsynchronousSocketChannel来使用CompletionHandlers执行读写操作。首先,我想知道是否保证写操作完全写出ByteBuffer。如果它是部分写入,则使用CompletionHandler可以完全写出ByteBuffer。也许使用递归?

同样适合阅读。我保证完全从AsynchronousSocketchannel读取整个消息,或者它也可以是部分读取。如果是这样,再次使用CompletionHandlers我怎么能编写一个可以执行完整读操作的处理程序。

提前感谢你 弗朗西斯

1 个答案:

答案 0 :(得分:1)

readwrite操作都不能保证写入或读取缓冲区的完整内容。它们只是读取或写入底层套接字中可用于读取操作的任何内容,或者操作系统可以将多少放入缓冲区以进行写入操作。

要可靠地执行完全读/写操作,只要缓冲区中有一些剩余空间/字节,您需要重复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
        }
});