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

TCP向一个Client异步发送数据会不会导致接收时数据混乱
如题 目前小弟在封装一个TCP网络通信类 遇到一点小疑问
在同步方式发送与接收数据是 数据是按照顺序发送的 我可以使用WriteLine方式一行行发送 在客户端可以开线程使用ReadLine方式读取 没有问题
现在为了提高性能 我想使用异步方式发送数据 但是还有一些疑问
比如我向一个Client用异步的方式发送了10条包含换行符("\r\n")的字符串 在客户端使用同步的ReadLine方式接收的时候 会不会出现10条字符串相互错乱的问题
也就是说 向一个Client异步发送10条数据 在系统内部是一条条发送 还是同时发送10条
如果同时发送10条 那我客户端使用同步的ReadLine方式是不是就会出现错误 那我在客户端使用异步接收的方式可以避免这个数据错乱吗

还请各位大侠仗义相救

------解决方案--------------------
如果发送一个消息使用一个BeginSend(而不是多个),那么接收端得到的这个消息一定也是连续的,不会出现这个消息的一部分跟其它消息的一部分混合的现象(tcp协议会正确地装配消息)。如果你执行10个beginSend命令,那么接收端收到消息的次序当然是不确定的,这是在发送时就决定了的,因为线程中的方法运行次序并不确定。tcp的特点是有一定延迟,以便对网络带宽的占用降到最低,它会同时发送多条消息。

在每一条信令都应该设计有(业务意义上的)序列号,这样就不会硬要弄成(不可取的)顺序的序列。
------解决方案--------------------
异步也有不同的操作模式,最简单的使用socket.beginSend之类的处理,你是没法控制其先后顺序,但如果你完全自行设计一种异步发送方式,如下:

C# code

循环线程1:  程序生成数据包->加入传输队列
    循环线程2:       从传输队列取数据包-〉压缩数据包-〉加入发送队列
         循环线程3:               从发送队列取数据->Socket.Send。