首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaNIO.2能否按顺序读取ByteBuffer?

JavaNIO.2能否按顺序读取ByteBuffer?
EN

Stack Overflow用户
提问于 2016-03-21 01:22:33
回答 1查看 471关注 0票数 0

对于任何感兴趣的人来说,这个问题的答案都是否定的,套接字不会按顺序读取缓冲区.

AsynchronousSocketChannel有可能按顺序读取字节吗?在调试问题的起始位置时,我的协议将对象序列化到32k以下,并将它们写入套接字中,如下所示:

代码语言:javascript
复制
AsynchronousSocketChannel socket; ...

// serialize packet

ByteBuffer base; // serialized buffer (unknown size, size growns as needed with limit of 32k)

for (int j1 = 0; j1 < 6 && base.remaining() > 0; j1++) { // limit to 6 tries

    socket.write(base).get(15, TimeUnit.SECONDS);
    if (base.remaining() > 0) {
        // aparently, if the write operation could write everything at once, we wouldnt have an issue
    }
}

此写操作不是并发的,而是与锁同步的。我使用的标准读取操作如下:

代码语言:javascript
复制
AsynchronousSocketChannel socket; ...

Future<Integer> reading = socket.read(getReadBuffer()); // the read buffer is 8k big

// consume the buffer also not concurrently

我可以每秒写入多达1000个数据包,每个包最多1000个字节,没有问题,但最终会有一个或其他客户端中断。如果数据包更大,它可以在不中断的情况下处理的频率会更低,如果我每秒写8字节,有40.000字节的数据包就会中断。

示例:我写了5个字节( 1,2,3,4,5 ),缓冲区足够大--一次写所有的东西,但是操作决定停止,缓冲区中的剩余字节(这应该是正常的TCP行为),所以假设操作编写了1,2,3,停止并写入了剩余的4,5 (而buf.remain >0{写}),在读取时,我很可能会先读取4,5和1,2,3,这是不应该发生的。

虽然在本地主机上一切正常工作,但就在同一台机器(仍然是相同的网络/路由器)之外,它将无法工作。

我不把缓冲器翻转来写/读。我可以确保序列化没有问题,而且服务器和客户端都是单线程的。我忘了做点什么?对如何解决这个问题有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-21 01:24:29

如果您真正想要的是同步I/O,那么您为什么要使用异步I/O,这是从代码中得到的。如果你有一个普通的SocketChannel,你会更好。

我不把缓冲器翻转来写/读。

你必须这样做。您必须在flip()之前使用write(),而在后面必须使用compact(),在本例中,‘as’的意思与上面的意思相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36121743

复制
相关文章

相似问题

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