我刚读了一篇文章说TCPClient.Read()可能无法在一次读取中获取所有发送的字节。你怎么解释这个?
例如,服务器可以将字符串写入tcp流。客户端读取字符串字节的一半,然后在另一个读取调用中读取另一半。
您如何知道何时需要组合两次调用中收到的字节数组?
答案 0 :(得分:17)
您如何知道何时需要组合两次调用中收到的字节数组?
您需要在协议级别做出决定。有四种常见的模型:
此外,不太常见的是,协议中每条消息始终特定大小 - 在这种情况下,您只需要继续操作,直到您读取了那么多数据。
在所有这些情况下,你基本上需要循环,将数据读入某种缓冲区,直到你有足够的数据,但是你确定了。您应该始终使用Read
的返回值来记录您实际读取的字节数,并且始终检查它是否为0,在这种情况下您已达到流的结束。
另请注意,这不仅会影响网络流 - 除了本地MemoryStream
之外的任何其他内容(如果它一直在流中,它将始终读取您要求的数据) ,您应该假设数据可能只在多次通话过程中可用。
答案 1 :(得分:-1)
您应该循环调用read()
。该循环的条件将检查是否仍有任何数据可供读取。
答案 2 :(得分:-3)
这有点难以回答,因为你永远无法知道数据何时到达,这就是为什么我通常使用线程在我的聊天程序中接收数据。但你应该可以使用类似的东西:
do{
numberOfBytesRead = myNetworkStream.Read(myReadBuffer,
0,
myReadBuffer.Length);
myCompleteMessage.AppendFormat("{0}",
Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
}
while(myNetworkStream.DataAvailable);
看看这个source!