TCP:一行中有多条消息

TCP:一行中有多条消息,tcp,Tcp,是否在TCP标准范围内,多条消息(从服务器连续发送到客户端)将以相同的顺序被客户端接受(并且一条消息的字节不会分散在其他消息中)?TCP提供了一种按顺序字节流传递服务。字节不会以其他顺序到达,但写入的数量不必等于读取的数量 您永远不会按照发送字节时的顺序读取字节 你不能对“消息”作任何假设。TCP不知道消息,只知道字节(见上文)。发送方和接收方都可以合并和拆分此类“消息” TCP使用序列号来标识数据的每个字节。序列号标识从每台计算机发送的字节顺序,以便数据可以按顺序重建,而不考虑传输过程中可能

是否在TCP标准范围内,多条消息(从服务器连续发送到客户端)将以相同的顺序被客户端接受(并且一条消息的字节不会分散在其他消息中)?

TCP提供了一种按顺序字节流传递服务。字节不会以其他顺序到达,但写入的数量不必等于读取的数量

  • 您永远不会按照发送字节时的顺序读取字节
  • 你不能对“消息”作任何假设。TCP不知道消息,只知道字节(见上文)。发送方和接收方都可以合并和拆分此类“消息”

TCP使用序列号来标识数据的每个字节。序列号标识从每台计算机发送的字节顺序,以便数据可以按顺序重建,而不考虑传输过程中可能出现的任何碎片、无序或数据包丢失。

我同意@cnicutar

如何反序列化对象?我怀疑问题就在那里

例如,如果您的消息是

ABCD
200毫秒后,接着是
PQR
。它可能表现为:

  • ABC
    后接
    PQR
  • ABCDPQR
  • 甚至是
    AB
    后面跟着
    CD
    后面跟着
    PQ
    后面跟着
    R
基本上,您无法根据接收数据的时间做出假设

反序列化逻辑应该知道字节流中的对象边界。该信息应通过序列化逻辑编码到流中

如果您使用的是Java,那么就可以使用
ObjectInputStream
&
ObjectOutputStream
,而不用担心序列化问题


有一个很好的序列化实用程序,可以很容易地移植到其他平台。我自己也曾在现场环境中使用过它。

正如我所想,但在我们的游戏中,当服务器连续发送两条大小约为75000字节的消息时,3个连接缓慢的玩家中的第2个无法进行初始化-它们的字节相互混合。所有其他时间服务器向每个客户端的消息发送非常小的消息(约100字节)。每次在客户端请求后发送“fat”消息都解决了这个问题,但我想知道为什么会发生这种情况?我用表示消息长度的整数值预处理每条消息,并接受它,只有当它完全被接受时才从缓冲区中删除。看起来像是套接字接受的ABCD和PQR消息,类似于“APBCQRD”.真奇怪。是否有多个线程同时写入套接字?不,甚至所有客户端都是单线程(我在服务器端使用ASIO)。客户端是Flash,这就是为什么我首先想知道TCP是否标准化了,在发布错误(如果有)之前将不同的消息分开。真的,我对Flash的bug表示怀疑,至少因为AS3的套接字只是WinSock上的一个上层结构,不是吗?