2

我正在尝试使用 实现客户端/服务器模型TCpClient,其Networkstream.Write()/Read()函数发送/接收字节数组。

它大部分时间都有效,除非我尝试一个接一个地连续发送三个或更多字节数组。客户端说它全部发送,但服务器只接收前两个。

下面是我用来从客户端编写到服务器的代码。

byte[] buffer = p.toByteArray(level);

stream.Write(buffer, 0, buffer.Length);
stream.Flush();

是巩固他们还是什么?我只是不明白当我发送 2 个而不是 3 个或更多时服务器如何接收不同的数组。如果我将 3 个写入分开,它可以正常工作,但我真的不想这样做。

任何帮助将非常感激。

编辑:

已解决 :) 感谢您的所有帮助。它一次推送 2-3 个数据包,我的系统认为 1 个突发 = 1 个数据包。我刚刚用 TCPClient 重写了我现有的架构来检测多个数据包:) 再次感谢您的帮助!

4

1 回答 1

1

在进行 Socket 编程时,有一个非常重要的核心规则需要考虑:

不能保证无论客户端在 X 中发送什么写入,服务器都会收到完全相同的读取量。它可以是客户端上的 1 次写入和服务器上的 10 次读取。它可以是 10 次写入和客户端,而服务器上只有 1 次读取。

假设客户端发送 3 条消息,每条 100 字节。服务器可能会收到 150 个字节,然后再收到 150 个字节。或 100 字节和 200 字节。

如果您使用 TCP,唯一可以保证的是订单将被保留,换句话说,您首先发送的任何内容都将首先到达服务器。

您可以使用以下基本技术之一来分离数据:

  • 标记(某种分隔消息的字节序列)
  • 每条消息的长度恒定
  • 消息头中的长度
  • 以上结合
于 2011-06-13T00:39:45.090 回答