此代码有效:
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作为字节数)
答案 0 :(得分:7)
如果这是一个基于TCP的流,那么答案是其余的数据还没有到达。
TCP是面向流的。这意味着Send
/ Write
次呼叫的数量与接收事件的数量之间没有关系。可以将多个写入组合在一起,并且可以拆分单个写入。
如果您想使用TCP上的消息,则需要在其上实现自己的打包算法。实现这一目标的典型策略是:
如果您想以阻止方式阅读所有数据,可以使用循环直到DataAvailable
为true
,但随后对Read
的调用将返回0
。 (希望我能正确地记住那部分,暂时没有做任何网络编程)
答案 1 :(得分:2)
答案 2 :(得分:1)
您需要循环读取消息中的字节,直到TCP客户端上的Available属性或NetworkStream的DataAvailable属性为0(=不再剩下字节数)
答案 3 :(得分:1)
此方法将数据读入缓冲区参数并返回 成功读取的字节数。如果没有可用的数据 读取时,Read方法返回0. Read操作读取的内容也是如此 数据可用,最大为大小指定的字节数 参数。如果远程主机关闭连接,则全部关闭 已收到可用数据,Read方法完成 立即返回零字节。
所以可能是因为连接失败,你每次都得到不同的数字,无论如何你可以检查结果,知道它的原因。
答案 4 :(得分:0)
我认为这里的答案很好地回应了您的具体问题,但可能更为一般:如果您尝试通过networkStream对象发送数据以进行网络通信,请查看开源库,{{3} }。