从TCPClient读取问题
问题描述:
我正在C#中制作一个简单的客户端应用程序,并且遇到了问题。从TCPClient读取问题
服务器应用程序发送一个格式为"<number> <param> <param>"
等的字符串。换句话说,第一个符号是一个整数,其余的是任何东西,每个都由一个空格分隔。
在阅读这个字符串时,我得到的问题是,我的程序首先用这个读取一个字符串,然后下一次我读取我得到的剩余消息。 例如,如果我是做什么我收到的WriteLine,它应该是这样的: (如果他将“1 0 0 0”)
1
0 0 0
(编辑:格式化似乎并不以允许这一点,1是在自己的一排,其余的应该是在下面的一排,包括第一个0之前的空间)
我已经用尽了想法如何解决这个问题。这里的方法(我评论了一些东西,我试过): http://pastebin.com/0bXC9J2f
EDIT(再次):我忘了,好像当我在调试和刚刚经历的一切按部就班工作得很好,所以我这种方式找不到任何问题的根源。
答
TCP是基于流而不是基于消息的。一个Read
可以包含任何下面的替代方案:
- 消息
- 半消息的蝇头纤细部分
- Excactly一个消息
- 一个半消息
- 两个消息
因此,您需要使用某种方法来查看是否有完整的消息到达。最常见的方法是:
- 添加页脚(例如一个空行),其指示消息
- 的末尾添加包含消息
答
的长度如果您的协议的固定长度首部是直接的TCP,那么你不能发送消息,字符串或除八位字节(字节)流之外的其他任何东西。你的'字符串'最后是否为空?如果是这样,你需要附加收到的数据,直到空到达,那么你有你的消息。
如果这是你的问题,那么你应该编写你的协议,以便它工作,无论在套接字上做多少次读取调用,例如。如果服务器发送以[99数据字节+#0]为空的字符串,那么协议应该能够组装正确的字符串,如果在一次调用中返回100字节,在100次调用中接收1字节,或者之间。
RGDS, 马丁
你应该真的* *使用更高级别的API。具体来说,那些'ReadLine'。 :) – bzlm 2011-05-30 17:14:09
我不知道有什么在C#中。自从我来自Java之后,我一直在对这整个byte []事情发誓,我可以从头开始将它作为一个字符串读取。 – Thomas 2011-05-30 17:19:23
在溪流周围摆放着一些简单的“StreamWriter”。也别忘了用换行符实际终止你的消息。 – bzlm 2011-05-31 09:43:24