对于任何感兴趣的人来说,这个问题的答案都是否定的,套接字不会按顺序读取缓冲区.
AsynchronousSocketChannel有可能按顺序读取字节吗?在调试问题的起始位置时,我的协议将对象序列化到32k以下,并将它们写入套接字中,如下所示:
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
}
}此写操作不是并发的,而是与锁同步的。我使用的标准读取操作如下:
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,这是不应该发生的。
虽然在本地主机上一切正常工作,但就在同一台机器(仍然是相同的网络/路由器)之外,它将无法工作。
我不把缓冲器翻转来写/读。我可以确保序列化没有问题,而且服务器和客户端都是单线程的。我忘了做点什么?对如何解决这个问题有什么建议吗?
发布于 2016-03-21 01:24:29
如果您真正想要的是同步I/O,那么您为什么要使用异步I/O,这是从代码中得到的。如果你有一个普通的SocketChannel,你会更好。
我不把缓冲器翻转来写/读。
你必须这样做。您必须在flip()之前使用write(),而在后面必须使用compact(),在本例中,‘as’的意思与上面的意思相同。
https://stackoverflow.com/questions/36121743
复制相似问题