我在解析来自套接字的 TCP 数据包时遇到一些麻烦...
在我的协议(protocol)中,我的消息是这样的:
'A''B''C''D''E'.........0x2300
'A''B''C''D''E' --> 开始消息模式
0x2300 --> 两个字节结束消息
但是由于Nagle's algorithm ,有时我的消息会像这样连接起来:
'A''B''C''D''E'......0x2300'A''B''C''D''E'...... ..0x2300'A''B''C''D''E'......0x2300
我已经尝试将 setNoDelay()
设置为 true,但问题仍然存在。
我有一个字节[]中的消息。
如何拆分消息以单独解析?
PS:现在我能够收到第一条消息,但其他消息都丢失了......
最佳答案
只需循环接收到的数据并检查结束标记即可。找到后,设置下一个包的起始索引并继续搜索。像这样的事情:
int packageStart = 0;
for(int i = 0; i < data.length - 1; i++) {
if(data[i] == 0x23 && data[i + 1] == 0x00) {
// Found end of package
i++;
processPackage(data, packageStart, i);
packageStart = i;
}
// At this point: from packageStart till data.length are unprocessed bytes...
如前所述,可能会有一些剩余数据(如果data
没有以结束标记结束)。您可能想要保留它,以便可以将其添加到下一批接收的数据中。从而防止由于 TCP/IP 包被切碎而导致数据丢失。
关于java - 解析 TCP 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14199351/