[英]Erroneous reading on Non-blocking java socket client
我有一个使用非阻塞IO用Java编写的客户端/服务器应用程序。
有几种消息类型以Json编码的形式传输,并在每个消息的末尾附加了一个消息定界符。
客户端读取字节并合并成块的消息。 在正常情况下,它可以正常工作,但在繁重的情况下,我会得到一个包含不正确顺序的消息的块。 我的意思是,假设我有一条消息m1 =“ AAABBBCCCDDD”和m2 =“ EEEFFF”,分隔符为“ ||”。 收到消息后,它应该是“ AAABBBCCCDDD || EEEFFF ||”。 但是接收到“ AAABBBEEEFFF || CCCDDD ||”。 结果,它无法解析消息。
实际上,我想听听使用无阻塞IO开发网络应用程序时应考虑的想法。 顺序错误的原因是什么? 读者代码是这样的:
ByteBuffer buffer = ByteBuffer.allocate(20000);
count = 0;
while ((count = channel.read(buffer)) > 0) {
buffer.flip();
processSocketData(Charset.defaultCharset().decode(buffer));
}
processSocketData()方法类似于:
socketData.append(newData);
delIndex = socketData.indexOf(cGlobals.delimiterSequence);
if (delIndex > -1) {
processRawMessage(socketData.substring(0, delIndex));
socketData.delete(0, delIndex + cGlobals.delimiterSize);
}
在处理之前,您需要先进行flip()
在处理完缓冲区之后,还需要compact()
或clear()
缓冲区。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.