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上的消息,则需要在其上实现自己的打包算法。 实现这一目标的典型策略是:

  1. 每个前缀按其长度打包,通常使用二进制数据
  2. 使用分隔序列,例如换行符。 通常与文本数据。

如果要以阻塞方式读取所有数据,可以使用循环,直到DataAvailabletrue但后续对Read调用返回0 。 (希望我能正确地记住那部分,暂时还没有做任何网络编程)

来自MSDN:

Read操作读取尽可能多的数据,最多可达size参数指定的字节数。

即你必须在循环中调用Read()方法,直到你收到所有数据。 看看MSDN中的示例代码 。

您需要循环读取消息中的字节,直到TCP客户端上的Available属性或NetworkStream的DataAvailable属性为0(=不再有字节)

阅读文档 :

此方法将数据读入buffer参数并返回成功读取的字节数。 如果没有可用于读取的数据,则Read方法返回0. Read操作读取尽可能多的数据,最多为size参数指定的字节数。 如果远程主机关闭连接,并且已收到所有可用数据,则Read方法立即完成并返回零字节。

所以可能是因为连接失败,你每次都得到不同的数字,无论如何你可以检查结果,知道它的原因。

我认为这里的答案很好地回应了你的具体问题,但可能更普遍:如果你试图通过networkStream对象发送数据用于网络通信,请查看开源库networkComms.net 。