這是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