2012-09-04 55 views
0

我有一臺服務器和多個通過TCP套接字連接的客戶端。服務器監聽首先使用其唯一設備ID註冊自己的連接客戶端。當設備首次註冊時,服務器會通過一條小消息「刺激」客戶端。這喚醒了客戶端從另一個來源下載數據。即使網絡出現故障,NetworkStream.Read仍會阻止

我們遇到的問題是,網絡通過GPRS,經常在覆蓋範圍較小的地區,網絡出現故障或服務質量較差。似乎發生的情況是,在客戶端內部,即使網絡層丟失,NetworkStream.Read()調用也會阻塞。沒有異常拋出,即使網絡返回時,調用似乎也沒有檢測到任何數據。

這是否有任何理由?我該如何解決這個問題?

我原以爲NetworkStream至少會拋出異常,所以客戶端可以進入重試連接階段。

+0

TCP需要輪詢。它沒有任何事件。我實現了一種機制來檢查服務器/客戶端是否通過'netstat'連接。你可以閱讀[這裏](http://www.timvk.be/news.php?readmore=33)。我希望它對你有幫助。 – TimVK

回答

0

NetworkStream不檢測一個客戶端與另一個客戶端之間的連接。它只是監聽數據。 Read()會阻塞線程直到它接收到數據。

取而代之,考慮使用BeginRead(或在.Net 4.5中的ReadAsync)。它不會阻塞線程,並且在沒有新數據超時後,可以關閉套接字,創建一個新套接字並重新開始。

0

你需要的是讀取超時。在某些情況下,即使對等端沒有運行,TCP讀取也可能永久阻塞。