2014-01-07 194 views
0

我正在使用tcp套接字編寫服務器/客戶端應用程序,我的問題是如何檢測半開連接,我計劃使用keep-alive,但有人建議我自己執行協議,所以我現在的計劃是:在tcp中檢測客戶端斷開連接

在服務器端


服務器將等待10秒,客戶端發送一些數據,如果在給定的時間服務器沒有從客戶端收到任何消息,服務器會將客戶端標記爲斷開連接,否則,如果服務器從客戶端接收到消息,它將重新設置定時器。

在客戶端


客戶端將發送每10秒的消息,但是,如果服務器請求從客戶端的一些數據(例如,如果該計數器是在5秒內,並且客戶端一些數據發送到所述服務器)客戶端中的定時器將重新設置爲0。

簡而言之,在收到最後一封消息以使連接關閉後,協議將從0到10進行計數。

我現在的問題是,這樣好嗎?或即時做錯了?或者這是一個壞主意?或者我會在客戶端和服務器上遇到任何問題/錯誤?或者我的連接會被這個方法的防火牆,NAT等阻塞?

謝謝。

回答

0

您可以在套接字上設置一個超時時間,儘管可以實現自己的協議以保持活動狀態。但是你不需要自己維護櫃檯。此外,您最好將超時時間設置爲保持活動時間間隔的兩倍,因此如果超時時間爲10秒,則應至少每隔5秒發送保持活動狀態。

0

這樣好嗎?

是的。

或即時做錯了嗎?

是的。您不需要維護自己的計時器,重置計時器等。只需使用Socket.setSoTimeout().每當您撥打read()時它會自動從零開始重新啓動,如果超時到期,則會拋出SocketTimeoutException

還是不好主意?

這是一個好主意,但是當Socket已經支持它的時候,你正試圖做自己的實現。

或者我會在客戶端和服務器上遇到任何問題/錯誤?

你會遇到SocketTimeoutException超時到期時讀取時,如果這會導致你關閉套接字,任何後續發送到插座將最終得到一個IOException: connection reset,,你必須應對正確,關閉IE瀏覽器在那端的套接字並忘記了這個對等體。

或者我的連接會被防火牆,NAT等阻止這種方法?

使用讀超時對防火牆或NAT沒有其他影響。

+0

thx爲答案,我有另一個問題,如果我用這種方式來檢測客戶端斷開連接,它會強調服務器/使用大量的資源,如果我有很多客戶端? –

相關問題