【问题标题】:Java TCP. How to affirm your received packet is a complete data structure?Java TCP。如何确认你收到的数据包是一个完整的数据结构?
【发布时间】:2013-02-07 22:15:12
【问题描述】:

我目前有一个在 TCP 套接字上侦听和发送的程序。

我遇到的问题是我发送了一个数据包,有时它会分解成碎片。所以我的监听 TCP 套接字类认为进来的第一部分是整个有效负载。

人们在使用 TCP 连接进行编程时采用的典型方法是什么?

【问题讨论】:

  • TCP 是一个面向流的协议。您不应该考虑数据包。有关我今天早上回答的类似问题,请参阅 stackoverflow.com/questions/14745716
  • 在发送确保收到完整对象的对象后发送一些代码字符串怎么样?
  • @JonSkeet 好吧,如果我发送了一个(我们会说)标头来说明“流”有多长。我们如何才能确定我们的“标题”是一体成型的。我的服务器应该不知道我的流有多大。所以我的客户需要告诉它。
  • @Mrshll187:你不能——但你通常会知道它有多长。 (例如,您总是发送 32 位长度的四个字节。)您可以继续阅读,直到您读完所有四个字节,此时您将知道您需要为消息读取多少其他数据.
  • 好的,这正是我需要听到的。谢谢@JonSkeet

标签: java tcp


【解决方案1】:

您不能假设第一部分是整个有效负载。您必须继续阅读套接字,直到读完为止。

有两种选择:

选项 1
标记消息(数据结构)的结尾。然后,您的听众会继续阅读,直到收到消息结束标记。

选项 2
在发送实际数据之前发送消息或数据结构的长度。然后,您的侦听器会继续读取,直到它读取所有字节。

【讨论】:

  • 您应该更喜欢选项 2,除非您可以确定您的数据在任何情况下都不能包含消息结束标记。
  • 如果数据需要包含标记,可以转义。这没什么大不了的。
猜你喜欢
  • 1970-01-01
  • 2012-08-05
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 2016-12-31
  • 2021-03-10
  • 1970-01-01
相关资源
最近更新 更多