clientStream.Read返回错误的字节数
此代码有效:
TcpClient tcpClient = (TcpClient)client; NetworkStream clientStream = tcpClient.GetStream(); byte[] message = new byte[5242880]; int bytesRead; bytesRead = clientStream.Read(message, 0, 909699);
但是这会返回错误的字节数:
bytesRead = clientStream.Read(message, 0, 5242880);
为什么? 我该如何解决?
(实际数据大小为1475186;代码返回11043作为字节数)
如果这是一个基于TCP的流,那么答案是其余的数据还没有到达。
TCP是面向流的。 这意味着Send
/ Write
呼叫的数量与接收事件的数量之间没有关系。 可以将多个写入组合在一起,并且可以拆分单个写入。
如果要使用TCP上的消息,则需要在其上实现自己的打包算法。 实现这一目标的典型策略是:
- 每个前缀按其长度打包,通常使用二进制数据
- 使用分隔序列,例如换行符。 通常与文本数据。
如果要以阻塞方式读取所有数据,可以使用循环,直到DataAvailable
为true
但后续对Read
调用返回0
。 (希望我能正确地记住那部分,暂时还没有做任何网络编程)
来自MSDN:
Read操作读取尽可能多的数据,最多可达size参数指定的字节数。
即你必须在循环中调用Read()方法,直到你收到所有数据。 看看MSDN中的示例代码 。
您需要循环读取消息中的字节,直到TCP客户端上的Available属性或NetworkStream的DataAvailable属性为0(=不再有字节)
阅读文档 :
此方法将数据读入buffer参数并返回成功读取的字节数。 如果没有可用于读取的数据,则Read方法返回0. Read操作读取尽可能多的数据,最多为size参数指定的字节数。 如果远程主机关闭连接,并且已收到所有可用数据,则Read方法立即完成并返回零字节。
所以可能是因为连接失败,你每次都得到不同的数字,无论如何你可以检查结果,知道它的原因。
我认为这里的答案很好地回应了你的具体问题,但可能更普遍:如果你试图通过networkStream对象发送数据用于网络通信,请查看开源库networkComms.net 。