日期:2014-05-17  浏览次数:21067 次

byte[]比如设定缓存2048,接收数据包时,怎么处理这样的情况?
比如我第一次接收的包数据是560个字节,第二次接收的370个字节,出现粘包问题,但是每次接收后2048-560、2048-370多余的字节都为0,怎么去除后面多余的空字节,把560和370连接起来。 谢谢

------解决方案--------------------
这个问题可以这么解决,修改包的定义,其中包含此次发送包的总包长,此后,凡是过来的数据,都依据该包里的总包长数,来取实际数据。
目前,我所接触过的成熟公司的消息收发,都采用的这种方式。如果你采用替换掉中间的0x00字节方式,很不可靠,因为,你能确保你传输的有效数据里没有0x00吗
------解决方案--------------------
先改成String类型
string message = Encoding.Unicode.GetString(buffer).TrimEnd('\0');
在处理成BYTE类型
byte[] buffer = Encoding.Unicode.GetBytes(message.ToCharArray());
在String类型上合并,这样处理应该可以吧??
------解决方案--------------------
楼主用的TCP收包吗?如果是的话,TCP收包的read方法会返回收到的字节数
至于两个包拼成一个包,就需要服务端和客户端制定一下你们自己的协议,可以在每次发数据之前,先发一个长度包,那样你就一直循环收包,一直收到够长度为止,在解析包数据
------解决方案--------------------
判断流的长度,再从byte数组里取相应的长度的byte
------解决方案--------------------
我最近也在开发TCP这一块的东西,也碰到你的问题,我的办法是用同步接收获取的数据,他会返回这次接收数据的长度,然后跟客户端自己订立的协议,每次发大数据包之前,先发送一个长度,然后同步接收循环读取到足够长度在解析。

用异步接收应该也能实现,不过没有同步接受好处理而已。
------解决方案--------------------
异步收到的数据先放入全局缓冲中,然后根据通信协议解析数据,数据不够就等到数据够了再解析.数据超过了缓冲,你自己看着处理.感觉不难吧.
------解决方案--------------------
探讨
BeginReceive(bytes, 0, 4000, SocketFlags.None, ReadCallback, readObject);
异步接收,bytes不知道实际收到多少,缓存是4000,不知道实际收到多少,没有办法解析