2011-05-30 60 views
1

我正在C#中制作一个简单的客户端应用程序,并且遇到了问题。从TCPClient读取问题

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

在阅读这个字符串时,我得到的问题是,我的程序首先用这个读取一个字符串,然后下一次我读取我得到的剩余消息。 例如,如果我是做什么我收到的WriteLine,它应该是这样的: (如果他将“1 0 0 0”)

1 
0 0 0 

(编辑:格式化似乎并不以允许这一点,1是在自己的一排,其余的应该是在下面的一排,包括第一个0之前的空间)

我已经用尽了想法如何解决这个问题。这里的方法(我评论了一些东西,我试过): http://pastebin.com/0bXC9J2f

EDIT(再次):我忘了,好像当我在调试和刚刚经历的一切按部就班工作得很好,所以我这种方式找不到任何问题的根源。

+0

你应该真的* *使用更高级别的API。具体来说,那些'ReadLine'。 :) – bzlm 2011-05-30 17:14:09

+0

我不知道有什么在C#中。自从我来自Java之后,我一直在对这整个byte []事情发誓,我可以从头开始将它作为一个字符串读取。 – Thomas 2011-05-30 17:19:23

+0

在溪流周围摆放着一些简单的“StreamWriter”。也别忘了用换行符实际终止你的消息。 – bzlm 2011-05-31 09:43:24

回答

8

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

  • 消息
  • 半消息的蝇头纤细部分
  • Excactly一个消息
  • 一个半消息
  • 两个消息

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

  • 添加页脚(例如一个空行),其指示消息
  • 的末尾添加包含消息
1

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

如果这是你的问题,那么你应该编写你的协议,以便它工作,无论在套接字上做多少次读取调用,例如。如果服务器发送以[99数据字节+#0]为空的字符串,那么协议应该能够组装正确的字符串,如果在一次调用中返回100字节,在100次调用中接收1字节,或者之间。

RGDS, 马丁