非阻塞java套接字客户端上的错误读取

时间:2014-08-08 07:28:58

标签: java sockets nio

我有一个使用非阻塞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);
}

1 个答案:

答案 0 :(得分:0)

在处理之前,您需要flip(),并且在处理之后还需要compact()clear()缓冲区。