即使客户端在网络流上写入数据,它也无法在服务器上使用

时间:2011-02-01 09:41:53

标签: c# tcpclient tcplistener networkstream

客户端编码

TcpClient tcpclnt = new TcpClient("192.157.1.1", 8001);
Stream stm = tcpclnt.GetStream();
byte[] bites = new byte[dataLength];
    // assigning values for bites
stm.Write(clientdata, 0, clientdata.Length);

服务器端编码

 TcpListener listener = new TcpListener(IPAddress.Any, 8001);
 listener.Start(10);
 Socket soc = listener.AcceptSocket();
 byte[] bites = new byte[1000];
 int avail = soc.Available;
 int receivedBytesLen = soc.Receive(bites);

在流上写入clientdata之后也在服务器端soc.Available为零。所以服务器无法读取数据。有什么问题?

3 个答案:

答案 0 :(得分:2)

数据被缓冲。客户必须写更多。或关闭流。

答案 1 :(得分:2)

NetworkStream.Flush()实际上并没有在.net 4.0中实现,因为msdn:

  

刷新流中的数据。此方法保留供将来使用。

您的问题可能是由nagle algorithm引起的,可以防止发送少量数据以减少拥塞。您可以尝试通过在tcpClient对象上设置以下属性来禁用它:

tcpClient.NoDelay = true;
tcpClient.Client.NoDelay = true;

如果您遇到问题,还可以结帐networkComms.net这是一个随时可用的解决方案。

答案 2 :(得分:-2)

stm.Write(...)添加呼叫stm.Flush()后,数据将刷新到网络。