这是this问题的延续。我是网络编程的新手,所以我只是写小样本的东西来获得理解,但在解释结果方面有些挣扎。设置NetworkStream.ReceiveTimeout不触发异常
看起来设置NetworkStream.ReceiveTimeout
当发送所有预期数据之前应该发送数据的客户端关闭时,它不能正常工作。
下面是示例代码:
在stream.Read()
呼叫
public static void Main(string[] args)
{
TcpListener listener = new TcpListener(IPAddress.Any, 10001);
listener.Start();
ThreadPool.QueueUserWorkItem(WriterThread);
using (TcpClient client = listener.AcceptTcpClient())
using (NetworkStream stream = client.GetStream())
{
client.ReceiveTimeout = (int)new TimeSpan(0, 0, 2).TotalMilliseconds;
stream.ReadTimeout = (int)new TimeSpan(0, 0, 2).TotalMilliseconds;
ReceiveMessage(stream, 1024);
}
listener.Stop();
Console.WriteLine("Done.");
Console.ReadKey(true);
}
private static void WriterThread(object state)
{
using (TcpClient client = new TcpClient())
{
client.Connect(new IPEndPoint(IPAddress.Loopback, 10001));
using (NetworkStream stream = client.GetStream())
{
byte[] bytes = Encoding.ASCII.GetBytes("obviously less than 1024 bytes");
stream.Write(bytes, 0, bytes.Length);
Thread.Sleep(10000); // comment out
}
}
}
private static byte[] ReceiveMessage(Stream stream, int length)
{
byte[] buffer = new byte[length];
int bufferFill = 0;
while (true)
{
bufferFill += stream.Read(buffer, bufferFill, buffer.Length - bufferFill);
if (buffer.Length == bufferFill)
return buffer;
Thread.Sleep(100);
}
}
这个版本工作正常触发例外。但是,如果我注释掉Thread.Sleep(10000)
,客户端将关闭连接,但侦听器无法识别它。主线卡在while(true)
循环内。 stream.Read()
一直返回零,但不会抛出异常。
这是正常的吗?如果是的话,我如何处理异常的客户端断开连接?
当'Stream.Read()'返回零时,它表明你已经到达流的ned。 – svick