使用TcpClient读取NetworkStream时设置超时

时间:2012-02-16 18:46:02

标签: c# tcpclient

我使用TcpClient( C#.NET 4 )实现了TCP客户端连接服务器:

// TCP client & Connection
TcpClient client = new TcpClient();
client.Connect(new IPEndPoint(IPAddress.Parse(IP), PORT));
NetworkStream clientStream = client.GetStream();

// Get message from remote server
byte[] incomingBuffer = new byte[1024];
Int32 bytes = clientStream.Read(incomingBuffer, 0, incomingBuffer.Length);
string problesWithThis = System.Text.Encoding.ASCII.GetString(incomingBuffer, 0, bytes);

与服务器的连接效果很好。但我可以只读取服务器的部分答案,并在下次连接尝试时读取未传递的部分消息

我尝试设置NetworkStream超时:

// No change for me   
clientStream.ReadTimeout = 10000;

然后我尝试模拟超时:

// This works well, the client has enough time to read the answers. But it's not the right solution.

// ....

NetworkStream clientStream = client.GetStream();
Thread.Sleep(TimeSpan.FromSeconds(1));

// Read stream ....

1 个答案:

答案 0 :(得分:4)

数据通过TCP以数据包形式传输,这些数据包是串行传输的(但不一定是正确的顺序)。当数据可用时,即当接收到逻辑(如果不是chronolgically)下一个数据包时,clientStream.Read()将立即返回此数据(可能是任何其他oo序列)中的数据 - 无论是否是发送方发送或未发送的所有数据。

您的Thread.Sleep()使程序等待一秒钟 - 此时多个数据包到达并在系统级别进行缓冲,因此对clientStream.Read()的调用将立即返回可用数据。

处理此问题的正确方法是循环Read(),直到BytesAvailable()变为零或检测到完整的应用层协议元素。