我有一个使用非阻塞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);
}
答案 0 :(得分:0)
在处理之前,您需要flip()
,并且在处理之后还需要compact()
或clear()
缓冲区。