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

延时接收信息的问题
设计:程序A用tcp连接到服务器上的一个服务B,A利用TcpClient中的NetworkStream.Write发送给B处理,B处理完后也利用Write返给A,A用Read读取出来数据。
设计流程:A NetworkStream.Write→B NetworkStream,Read→B 处理接收到的数据→B NetworkStream.Write→A NetworkStream.Read→A 处理返回来的数据
问题:我程序里写的A是客户端,A在执行完NetworkStream.Write操作后,紧接着就执行A NetworkStream.Read操作。这里就有些问题了,就是A刚Write完,就Read,能不能读出完整信息?这是不是取决于网络传输速度、B的处理速度?我怕太快让A Read会造成不能取出完整数据。
需要解决的:怎么实现A判断B传输完数据后再Read?

------解决方案--------------------
你没有设超时的话,Read会一直等到有数据才返回,这叫阻塞。也就是说正常发完数据马上读不会丢数据,反而怕没有及时去读会丢数据,比如网络缓冲区溢出。同时,可以通过调用 CanRead 属性来查看 NetworkStream 是否可读。
------解决方案--------------------
不要等待B传输完再接收,必须及时接收,否则B无法传输。
A刚Write完,就Read是非常正确的。那个Read调用后,就自动等待B的Write,如果B始终不Write,那么A的Read始终不会返回(如果设置了超时,直到超时)。如果B在Write后关闭了NetworkStream,那么A的Read将返回0个字节,表示此次消息传输结束。整个过程只有“请求--响应”,没有多段操作的情况,因此B返回的信息中不需要内容长度 、结束符等额外信息,但是A发送给B的信息中需要有结束符或第一个字节存储后续字节数来告知B,否则B不知道A是否发送结束,不知道何时返回信息。