【问题标题】:Tcp data is getting attached in each otherTcp 数据相互连接
【发布时间】:2015-12-11 12:17:40
【问题描述】:

我在使用 tcp 时遇到问题。 当我在客户端或服务器中读取和写入数据时,他应该每次将其作为一个数据包读取。

但有时当我非常快地写入数据时(例如在循环中),客户端将其作为一个数据接收,而不是将其作为三个不同的数据包处理。

发送数据:

messageToSend = Encoding.ASCII.GetBytes(data);        
c.GetStream().Write(messageToSend, 0, messageToSend.Length);

在客户端接收:

byte[] message = new byte[1024];
int i = 0;
i = c.GetStream().Read(message, 0, message.Length);
Encoding.ASCII.GetString(message, 0, i);
//Handle the new data....

希望它足够清楚,并在此先感谢!

【问题讨论】:

  • 显示您如何将数据写入客户端。
  • 类似的东西:messageToSend = Encoding.ASCII.GetBytes(data); c.GetStream().Write(messageToSend, 0, messageToSend.Length);

标签: tcp stream server client


【解决方案1】:

TCP 按照设计是流协议,如果您的读取速度不够快,它会堆积在缓冲区中。例如 UDP 是 dgram 协议,它具有可单独读取的固定数据包。

【讨论】:

  • 是的,在此之前我确实使用过 UDP,但我想尝试 TCP。有什么可以帮助我的标志或其他东西吗?
  • @cnc 否。TCP 不为您提供数据包/帧 API。您需要以某种方式自己处理在 TCP 上发送/接收的数据,这样您就可以将对您的应用程序有意义的数据包彼此分开,这样您就可以知道何时有一个完整的数据包等。
  • @nos 所以你是说我需要添加到字符串 BEGIN 和 END 并拆分它?
  • @cnc 是的,这是一种方式,请注意,您可能无法通过一次 .Read() 调用获得“BEGIN”和“END”之间的所有内容,或者您​​可能会获得多个。或者介于两者之间的任何东西,所以你也需要处理它。或者,您可以在要发送的每个数据包的前面加上数据包的长度,然后先读取该长度以了解您需要读取多少数据。
  • @cnc 对于 UDP 来说甚至都不是这样。单个 UDP 数据报可以拆分为多个数据包。
猜你喜欢
  • 2011-02-05
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 2014-12-27
  • 2017-01-13
相关资源
最近更新 更多