Java TCP。如何确认您收到的数据包是完整的数据结构?

Java TCP。如何确认您收到的数据包是完整的数据结构?,java,tcp,Java,Tcp,我目前有一个程序,可以监听和发送TCP套接字 我遇到的问题是,我发送了一个数据包,有时它会碎裂。因此,我的侦听TCP套接字类认为第一部分是整个有效负载 当使用TCP连接编程时,人们通常采用什么方法?您不能假设第一部分是整个有效负载。你必须一直读取插座上的读数,直到你全部读取完毕 有两种选择: 选项1 标记消息(数据结构)的结尾。然后,您的侦听器继续阅读,直到它获得消息末尾标记 选项2 在发送实际数据之前,先发送消息或数据结构的长度。然后,您的侦听器继续读取,直到读取所有字节。TCP是一种面向流的

我目前有一个程序,可以监听和发送TCP套接字

我遇到的问题是,我发送了一个数据包,有时它会碎裂。因此,我的侦听TCP套接字类认为第一部分是整个有效负载


当使用TCP连接编程时,人们通常采用什么方法?

您不能假设第一部分是整个有效负载。你必须一直读取插座上的读数,直到你全部读取完毕

有两种选择:

选项1
标记消息(数据结构)的结尾。然后,您的侦听器继续阅读,直到它获得消息末尾标记

选项2

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

TCP是一种面向流的协议。你不应该用数据包来思考问题。请参阅我今天早上回答的一个类似问题。在发送对象后发送一些代码字符串以确保接收到完整的对象如何?@JonSkeet好的,如果我发送一个(我们会说)头,告诉“流”的长度。我们怎么能确保我们的“头球”是完整的。我的服务器应该不知道我的流有多大。所以我的客户需要告诉我。@SHLL187:你不能-但你通常知道它有多长时间。(例如,对于32位的长度,您总是发送四个字节。)您可以一直读取,直到读取完所有四个字节,此时您就知道需要为消息读取多少其他数据。好的,这正是我需要听到的。谢谢@jonskeety您应该选择选项2,除非您可以确保您的数据在任何情况下都不能包含消息结尾标记。如果数据需要包含标记,则可以转义。没什么大不了的。