2011-10-06 93 views
1

我有一個服務器/客戶端應用程序。網絡套接字上的C#BinaryReader.ReadString

通信時都使用BinaryReader/Writer。

當客戶端和服務器正在快速交換消息時,大多數時間在給定的秒鐘內,並且我大多數時間(但不是總是)關閉服務器(通過內置命令,有序關閉)客戶端的BinaryReader.ReadString( )方法拋出一個EndOfStreamException,這很好。我不明白的是爲什麼這個異常不會將TcpClient.Connected屬性更改爲'false'?

while(true){ 
    try{ 
     BinaryReader.ReadString() 
    } 
    catch(IOException){ 
    if(!TcpClient.Connected) 
     break; 
    //BinaryWriter.Write() - this will, eventually, change Connected property to 'false' 
    } 
} 

這將無休止地循環。我認爲Connected屬性在不成功的網絡讀/寫中發生變化。如果BinaryReader拋出異常,那麼它不會成功讀取,是嗎?

如果我拋出一個BinaryWriter.Write(),然後無限循環被打破,因爲連接屬性更改爲'假'。

相關的問題,一個EndOfStreamException總是指示一個斷開的網絡連接,或者它可能意味着一個臨時問題?

回答

2

按設計。從MSDN庫文章TcpClient.Connected的備註部分:

,因爲連接的屬性只反映了 連接的最近操作的狀態下,你應該嘗試發送 或收到消息確定當前狀態。消息 發送失敗後,此屬性不再返回true。請注意,這個 行爲是有意設計的。您無法可靠地測試連接的狀態,因爲在測試與發送/接收之間的時間內,連接可能已丟失。您的代碼應該假設 套接字已連接,並且優雅地處理失敗的傳輸

您發現的解決方法是正確的。

+0

我知道,我發現令人費解的是,讀取失敗並不會改變Connected屬性。我可能無法閱讀百萬次,而Connected仍然是「真實的」。根據MSDN,讀取或寫入不成功將會更改Connected屬性,但在我的示例中,讀取失敗時看起來是不真實的。 – user983110

+0

看起來好像BinaryRead()一遍又一遍地讀取相同的數據而不敲擊套接字。但是這樣會與BinaryRead()MSDN文檔發生衝突,這似乎表明,讀取數據失敗後永遠不會返回到流中。 – user983110

+0

沒關係,我現在得到它:) – user983110