从TCPClient读取问题

时间:2011-05-30 16:55:28

标签: c# .net sockets

我在C#中创建一个简单的客户端应用程序,并且遇到了问题。

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

我在阅读这个字符串时得到的问题是我的程序首先读取了一个字符串,然后在下次读到时我得到了剩下的消息。 例如,如果我在收到的内容上写了一条令牌,它看起来像这样: (如果他发送“1 0 0 0”)

1
 0 0 0 

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

我已经没有想法如何解决这个问题。这是方法(我注释了一些我试过的东西): http://pastebin.com/0bXC9J2f

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

2 个答案:

答案 0 :(得分:8)

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

  • 消息的一小部分内容
  • 半信息
  • 只有一条消息
  • 一条半消息
  • 两条消息

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

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

答案 1 :(得分:1)

如果您的协议是直接TCP,那么您不能发送消息,字符串或除八位字节(字节)流之外的任何其他内容。你的'字符串'最后是否为空?如果是这样,您需要附加收到的数据,直到空到达,然后您收到消息。

如果这是你的问题,那么你应该对协议进行编码,这样无论在套接字上进行多少次读取调用,它都能正常工作,例如。如果服务器发送了以[99数据字节+#0]为空的字符串字符串,则如果在一次调用中返回100个字节,在100次调用中接收到1个字节,或者其他任何内容,则您的协议应能够组合正确的字符串之间。

RGDS, 马丁