1

我正在編寫一個簡單的C#服務器和客戶端,但它不會在客戶端斷開連接時引發異常。它會繼續從客戶那裏讀取,認爲客戶仍然在那裏。當客戶不在時它也不再阻止。如果客戶端不再可用,我希望它會拋出異常。C#NetworkStream不會拋出異常

private TcpListener server; 
private NetworkStream stream; 
private TcpClient client; 
private byte[] buffer = new byte[1]; 

server = new TcpListener (serverIp, _portNumber); 
server.Start(); 

stream = client.GetStream(); 

//我想拋出異常的部分,當客戶端走了,但沒有。

try 
{ 
    stream.Read(buffer,0,1); 
} 
catch(Exception e) 
{ 
    #if (DEBUG) 
    Debug.Log ("Failed Rading " + e.Message); 
    #endif 
    return 0; 
} 

任何幫助,將不勝感激。

回答

0

有什麼你可以做,除了超時。服務器無法發現客戶端已經消失的事實。

你需要忍受這個事實。設置超時。

+0

我應該什麼時候設置超時時間? – Programmer 2014-10-20 10:53:55

+0

選擇假陽性和假陰性之間的良好折衷。取決於網絡以及您需要多快來檢測掉線連接。在大多數情況下,合理的值是[1,30]秒。另外,要明白,在所有情況下,沒有其他方式可以檢測到失敗的連接。超時是唯一可能的全面解決方案。 – usr 2014-10-20 11:15:28

+0

你介意發佈一個代碼片段嗎? TcpClient和NetworkStream類都具有超時功能。我應該設置哪些? – Programmer 2014-10-20 11:42:29

0

當連接關閉並且緩衝區中沒有更多數據要讀取時,它應該會引發異常。顯然還有數據可用。當緩衝區和連接關閉時,你應該得到一個異常。 另外我看到你讀數據1字節的時間。爲什麼不先檢查連接是否處於活動:

client.Client.Poll(0, SelectMode.SelectRead) 

檢查是否有數據可供讀取和讀取正確的金額:如果客戶端消失,並且不通知服務器

int available = client.Client.Available; 
if(available > 0) 
{ 
    var buffer = new byte[available]; 
    client.Read(buffer, 0, available); 
} 
+0

if(server.Client.Availabe)聽起來很棒,但Client.Available部分沒有在任何地方定義。我有一些錯誤。 – Programmer 2014-10-20 10:23:52

+0

可用不是有用的值。如果返回0,則不知道確實沒有可用的數據。此外,您無法以任何方式可靠地檢查連接中斷。 – usr 2014-10-20 10:36:55

+0

您是否包含套接字名稱空間? http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.aspx – Taxos 2014-10-20 11:07:08