首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >完全使用CompletionHandler的NIO2 AsynchronousSocketChannel读/写

完全使用CompletionHandler的NIO2 AsynchronousSocketChannel读/写
EN

Stack Overflow用户
提问于 2016-06-21 06:37:10
回答 1查看 2.3K关注 0票数 1

我正在使用Java7的nio2 AsynchronousSocketChannel通过CompletionHandlers执行读写操作。首先,我想知道写操作是否保证将ByteBuffer完全写出。如果是部分写入,使用CompletionHandler可以完全写出ByteBuffer。也许使用递归?

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

先谢谢你,弗朗西斯

EN

回答 1

Stack Overflow用户

发布于 2016-06-21 18:21:19

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

要可靠地执行完全读/写,只要缓冲区中有一些剩余空间/字节,就需要重复read/write操作:

代码语言:javascript
复制
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
        }
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37932919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档