从TCPClient读取时出现问题

本文关键字:问题 TCPClient 读取 | 更新日期: 2023-09-27 17:58:11

我正在用C#制作一个简单的客户端应用程序,遇到了一个问题。

服务器应用程序发送一个"<number> <param> <param>"等格式的字符串。换句话说,第一个符号是整数,其余符号都是任意符号,所有符号都用一个空格隔开。

当我读取这个字符串时,我遇到的问题是,我的程序首先用读取一个字符串,然后下次读取时,我会得到其余的消息。例如,如果我要对我收到的内容写一行,它会是这样的:(如果他发送"1 0 0 0")

1
 0 0 0 

(编辑:格式似乎不允许这样做。1在自己的一行上,其余的应该在下面的一行,包括第一个0之前的空格)

我已经没有办法解决这个问题了。以下是方法(我评论了我尝试过的一些东西):http://pastebin.com/0bXC9J2f

编辑(再次):我忘了,当我在调试时,它似乎工作得很好,只是一步一步地完成所有事情,所以我找不到任何问题的根源。

从TCPClient读取时出现问题

TCP是基于流的,而不是基于消息的。一个Read可以包含以下任何替代方案:

  • 信息的微小部分
  • 半句话
  • 一条信息
  • 一条半信息
  • 两条消息

因此,您需要使用某种方法来查看是否已收到完整的消息。最常见的方法是:

  • 添加一个页脚(例如空行),指示消息结束
  • 添加包含消息长度的固定长度标头

如果您的协议是直接TCP,那么您不能发送消息、字符串或除八位字节流之外的任何其他内容。您的"字符串"末尾是否为null?如果是这样,您需要附加接收到的数据,直到null到达,然后您就有了消息。

如果这是你的问题,那么你应该对你的协议进行编码,使其无论在套接字上进行多少次读取调用都能工作,例如,如果服务器发送了一个以null结尾的字符串[99个数据字节+#0],如果在一次调用中返回100个字节,在100次调用中接收到1个字节,或者介于两者之间,你的协议应该能够组装正确的字符串。

Rgds,Martin