TcpClient的NetworkStream什么时候完成一个读操作?我正在从事一个涉及通过TCP和Google协议缓冲区进行客户端服务器通信的项目。在客户端,我基本上使用NetworkStream.Read()通过字节数组缓冲区从服务器进行阻塞读取。根据MSDN文档,该方法将数据读入buffer参数,返回成功读取的字节数。如果没有数据可供读取,则Read方法返回0。Read操作会读取尽可能多的数据,直到达到size参数指定的字节数。如果远程主机关闭连接,并且已接收到所有可用数据,则Read方法立即完成并返回零字节。异步读取(NetworkStream.BeginRead和EndRead)也是如此。我的问题是Read()/EndRead()什么时候返回?看起来它在填充缓冲区中的所有字节后返回。但在我自己的测试中,情况并非如此。单个操作中读取的字节差异很大。我认为这是有道理的,因为如果在发送消息时服务器端出现暂停,则客户端不应该等到读取缓冲区已满。Read()/EndRead()本身是否有一些超时机制?我试图弄清楚Mono如何在NetworkStream中实现Read()并保持跟踪直到调用外部方法Receive_internal()。它读取网络流上可用的所有数据或缓冲区已满的数据。以先到者为准。您已经注意到这种行为。所以你需要处理所有的字节,看看消息是否完整。您可以通过构造一条消息来做到这一点。有关如何执行此操作的信息,请参阅有关异步套接字操作的.NET问题和消息传递框架。至于超时问题,如果假设您要问beginread是否有超时,我会说没有,因为它只是等待数据到达流并将其放入缓冲区,之后您可以处理传入的字节.读取操作中可用的字节数取决于网络(例如延迟、代理限制)和发送数据的客户端等因素。BeginRead行为总结:调用BeginRead();->等待字节到达流...1个或更多字节已到达Stream开始将第2步中的字节放入给定缓冲区CallEndRead();->缓冲区内的字节可以由EndRead()处理;最常见的做法是再次重复所有这些步骤。如果Read正在等待一个完整的数据缓冲区,如果远程方期望您的响应但您正在等待一个永远不会到来的完整缓冲区,则它很容易死锁。按照这个逻辑,如果数据可用,它必须无阻塞地返回。即使它只是一个可用字节。假设服务器每50毫秒发送一条消息(100字节),那么客户端在一次NetworkStream.Read()调用中读取了多少字节?每次调用都将在一个字节和可用字节数之间返回,而不会阻塞。没有,没有其他保证。实际上,您将同时获得一个或多个网络数据包。堆栈保留空闲字节没有意义。以上是C#学习教程:TcpClient的NetworkStream什么时候完成一次读操作?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
