【发布时间】:2014-07-11 09:41:56
【问题描述】:
在一个TcpClient/TcpListener设置中,从接收端的角度来看有什么区别:
// Will sending a prefixed length before the data...
client.GetStream().Write(data, 0, 4); // Int32 payload size = 80000
client.GetStream().Write(data, 0, 80000); // payload
// Appear as 80004 bytes in the stream?
// i.e. there is no end of stream to demarcate the first Write() from the second?
client.GetStream().Write(data, 0, 80004);
// Which means I can potentially read more than 4 bytes on the first read
var read = client.GetStream().Read(buffer, 0, 4082); // read could be any value from 0 to 4082?
我注意到DataAvailable 和GetStream().Read() 的返回值不能可靠地判断是否有传入数据在途中。我是否总是需要编写一个 Read() 循环来准确读取前 4 个字节?
// Read() loop
var ms = new MemoryStream()
while(ms.length < 4)
{
read = client.GetStream().Read(buffer, 0, 4 - ms.length);
if(read > 0)
ms.Write(buffer, 0, read);
}
【问题讨论】: