java - 解析 TCP 数据包

标签 java parsing tcp packet

我在解析来自套接字的 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/

相关文章:

java - 如何将一维数组拆分为具有特定列大小的二维数组?

java - 如何暂停 Java 线程一小段时间,比如 100 纳秒?

java - 将代码从 Java 更改为 Kotlin 后,注释未正确转换

python - 获取 <b> 标签中文本的下一个内容

linux - Haproxy 绑定(bind)错误

java - 损坏的 Protocol Buffer 消息

java - org.obolibrary.oboformat.parser.OBOFormatParser警告警告: LINE: 901 Expected white space at pos: 6 LINE: </rdf:RDF>

c# - 如何处理解析器中的反向引用?

c - 通过 TCP 套接字发送任意长度的多条数据的正确技术

sockets - 从半开套接字读取