- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在从事一个涉及通过 TCP 和 Google Protocol Buffer 进行客户端服务器通信的项目。在客户端,我基本上使用 NetworkStream.Read() 来阻止通过字节数组缓冲区从服务器读取。
根据 MSDN 文档,
This method reads data into the buffer parameter and returns the number of bytes successfully read. If no data is available for reading, the Read method returns 0. The Read operation reads as much data as is available, up to the number of bytes specified by the size parameter. If the remote host shuts down the connection, and all available data has been received, the Read method completes immediately and return zero bytes.
异步读取(NetworkStream.BeginRead 和 EndRead)也是如此。我的问题是 Read()/EndRead() 什么时候返回?看起来它会在缓冲区中的所有字节都被填满后返回。但在我自己的测试中,情况并非如此。一次操作读取的字节变化很大。我认为这是有道理的,因为如果发送消息时服务器端出现暂停,则客户端不应该等到读取缓冲区已满。 Read()/EndRead() 本身是否具有某种超时机制?
我试图找出 Mono 如何在 NetworkStream 中实现 Read() 并跟踪直到调用外部方法 Receive_internal() 。
最佳答案
它读取网络流上或缓冲区已满时可用的所有数据。以先到者为准。您已经注意到这种行为。
因此您需要处理所有字节并查看消息是否完整。您可以通过构建消息来完成此操作。参见 .NET question about asynchronous socket operations and message framing关于如何做到这一点。
关于超时问题,假设你问一个beginread是否有超时,我会说没有,因为它只是在等待数据到达流并放入缓冲区,之后你可以处理传入的字节。
读取操作可用的字节数取决于您的网络(例如延迟、代理限制)和发送数据的客户端等因素。
BeginRead 行为总结:
关于c# - TcpClient 的 NetworkStream 什么时候完成一次读操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21792461/
我希望有人可以解释这种行为,或者它是否可能是 .NET 中的错误。 由于夏令时而及时向后移动意味着 NetworkStream 不注意其属性 ReadTimeout,并且在此代码的情况下会导致循环旋转
我需要从 NetworkStream 中读取,它会随机发送数据,数据包的大小也会不断变化。我正在实现一个多线程应用程序,其中每个线程都有自己的流来读取。如果流中没有数据,应用程序应该一直等待数据到达。
我编写了以下函数来使用 NetworkStream 的异步读取函数(BeginRead 和 EndRead)实现超时功能。它工作正常,直到我注释掉行 Trace.WriteLine("bytesRea
如果 Internet 上的 B 类网络的子网掩码为 255.255.248.0,那么每个子网的最大主机数是多少?(一) 1022(乙) 1023(三) 2046(D) 2047 任何人都可以告诉我如
我读过一个 Tcp Echo Server 的例子,有些事情我不清楚。 TcpClient client = null; NetworkStream netStream = null; try {
This question already has answers here: NetworkStream.ReadAsync with a cancellation token never canc
我正在使用套接字编写一个简单的聊天程序。当我发送长消息时,随后刷新流和短消息,长消息的末尾会附加到短消息中。它看起来像这样: 发送“aaasdsd” 接收“aaasdsd” 发送“bb” 接收“bba
我目前正在从事一个网络项目,我在其中制定了一个二进制协议(protocol)。我的数据包看起来像这样:[1 字节类型][2 字节索引][2 字节长度][长度字节数据] 这是我接收数据包的代码: Net
我的应用程序打开一个 NetworkStream 和一个 StreamWriter 以将 HL7 消息发送到服务。此服务接收 HL7 消息并始终发回确认。我遇到以下问题:在发送 HL7 消息(有效,我
在同一台计算机上,我有 2 个控制台应用程序。 (客户端向服务器发送文件) 在开始之前,我只想提一下我正在使用这两个 async 函数: 从 NetworkStream 读取: public sta
我正在编写一个简单的客户端-服务器应用程序,在查看 MSDN 文档时,我遇到了一些有趣的流类型... http://msdn.microsoft.com/en-us/library/system.io
早上好 我需要一些建议,我正在使用从 TcpClient 流式传输的 networkStream,一切正常,但后来我需要其他地方的一些功能,这需要关闭流。一旦连接关闭,我似乎找不到重新打开连接的方法。
只是尝试使用 Networkstream,这是我写的一个简单代码: 客户端: TcpClient c = new TcpClient(); c.Connect("10.0
我使用 Moq 和 NUnit 作为单元测试框架。 我写了一个方法,将 NetworkStream 对象作为参数: public static void ReadDataIntoBuffer(Netw
好吧,所以我理解 TCP 是基于流而不是基于消息的整个想法 - 我不关心这个。 我想做的是简单地序列化一些东西,然后通过网络将它发送到另一个使用相同的基于消息的协议(protocol)的应用程序。 问
NetworkStream 从套接字缓冲区读取不应该存在的数据时出现问题。顺便说一句,我正在发送非常大的缓冲区。现在我刚刚在本地主机上进行测试。 这是我读取数据的方式,前 4 个字节包含消息的长度,然
我使用 TcpClient 和 NetworkStream 为我们的游戏创建了一个简单的持久套接字连接。正常连接、发送消息和断开连接(退出应用程序/服务器关闭/等)都没有问题。 但是,我遇到了一些问题
有问题的数据是一个 PNG 文件,前缀为 int 大小。 -Sending: ns.Write(BitConverter.GetBytes((int)data.Length),0,4); ns.Wri
NetworkStream.DataAvailable 是否知道发送方的发送缓冲区是否为空?或者它只是简单地指示接收方的读取缓冲区是否有数据?我的假设是后者... 具体来说,对于一些涉及正在进行的对话
我有一个类,它包装了一个 Stream 实例,所以我可以用它来包装 FileStreams 和 NetworkStreams。现在,我想测试流是否仍在传递任何数据,换句话说,我想测试 NetworkS
我是一名优秀的程序员,十分优秀!