簡體   English   中英

Java TCP Socket等待空閑嗎?

[英]Java TCP Socket wait for idle?

我不確定這是否是Java問題或TCP問題,或兩者兼而有之:

我有一些使用Apache Mina的服務器代碼,該代碼運行在給定套接字上偵聽TCP的服務器。 我擁有的處理程序擴展了IoHandlerAdapter。 我正在使用它通過HTTP / 1.1將相機連接到Java服務器

問題是:如果我建立了連接,然后完全斷開了攝像機的連接(拉電源或拉網絡),則必須等到調用sessionIdle方法來檢測到該會話現在已死(然后從關閉該會話)服務器端)。

我的問題是:難道沒有辦法知道客戶端立即中斷了TCP會話嗎? 還是這只是TCP會話/ Mina的工作方式?

理想情況下,sessionIdle僅適用於TCP套接字尚未終止但客戶端(攝像機)已停止通過套接字進行通信的情況……並且當套接字被客戶端(或網絡)殺死時,某些其他機制會捕獲。

注意:我覆蓋了exceptionCaught(),但是在拔掉電源或網絡的情況下卻看不到該調用。 它一直坐着直到空閑時間再調用sessionIdle()。

謝謝!

不幸的是,無法立即檢測到連接一端的突然刪除,因為被刪除的一端沒有機會通知連接的另一端。

TCP連接的兩端沒有連接字符串(可以這么說),而是僅在連接狀態上有協議。 結果是,除非達到超時,否則無法知道連接的另一端已經消失,除非該連接的另一端發送了有關斷開連接的意圖的通知。

打個比方,假設您正在與另一個房間的某人進行對話,而您卻看不見。 您何時認為它們不再存在? 如果他們告訴您他們要離開,然后您聽到門猛然關上,則可以合理地假設他們已經離開。 但是,如果他們只是不能回答問題,您可能會重復該問題,這次可能會更大聲。 然后,您可以稍等片刻,給他們打電話,或者再等一會兒,然后最后走到另一個房間,看看他們是否還在。

TCP基本上就是這樣做的(特別是如果您要發送保持活動),除了它沒有辦法走到另一房間並且只能依靠超時閾值來表明另一方已經離開之外。 因此,如果在對方沒有響應的情況下發生超時,則假定他們離開了而沒有告訴您。

這就是為什么當連接的另一端突然消失時,您必須依靠超時來告訴您的原因,因為根本沒有其他方法可以知道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM