此代码有效:
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
。 (希望我没有记错那部分,好久没做过网络编程了)
关于c# - clientStream.Read 返回错误的字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8575659/