簡體   English   中英

這是檢查套接字是否在Java中失效的好方法嗎?

[英]Is this a good method of checking whether a socket died in Java?

我正在研究Java聲音傳感器,它可以告訴您另一端是否死亡。 我發現了一些這樣的代碼

        isConnected = kkSocket.isConnected() &&
                      !kkSocket.isClosed() &&
                      InetAddress.getByName(serverAddress).isReachable(1000);

這是一種可靠的方法嗎? 我對這行感到困惑:

InetAddress.getByName(serverAddress).isReachable(1000);

這是做什么用的-如果我在“ localhost”上進行測試(即不是真正的網絡示例,僅是一台機器),它將起作用嗎? 謝謝

這些都沒有用。 isConnected()方法告訴您是否曾經(隱式或顯式)調用connect()或通過accept()接收了套接字; isClosed()方法告訴您是否曾經調用過close() ; isReachable()方法僅告訴您主機是否可訪問,並且這樣做會以額外的TCP連接設置和每次成功調用的中斷為代價。

沒有有什么任何做連接的狀態 檢測TCP連接上錯誤的唯一可靠方法是嘗試對其進行寫入。

這取決於您的意思是“如果另一方死亡”。

首先, isConnected()調用是沒有用的。 這只是詢問套接字是否在過去的某個時間連接過。 期。

其次, isClosed()調用沒有用。

第三, isReachable()調用沒什么用。 它確實為您提供了一定程度的保證,即該服務的主機在基本網絡級別上是否有效並且可以訪問。 (特別是,它告訴您ICMP Ping數據包正在到達主機,並且響應正在返回。)但是,這並不能告訴您與該服務的TCP / IP連接是否處於活動狀態,或者該服務本身是否處於活動狀態。仍然可以正常運行。 實際上,主機可以響應Ping數據包,並拒絕或忽略嘗試連接到該服務的嘗試。

實際上,確保服務真正有效的唯一方法(在有用的意義上)是嘗試使用它。 這意味着什么取決於服務的性質。 對於典型的同步服務,您將向套接字輸出流中寫入請求“消息”,然后嘗試從輸入流中讀取答復“消息”。 (您應確保在閱讀文章時使用超時...):

  • 如果服務已終止或TCP / IP連接已斷開,則應獲取SocketException或類似的異常。 (但是請注意,斷開的TCP / IP連接並不一定意味着該服務沒有運行。您可能只需要再次連接即可。)
  • 如果服務被“卡住”,則您的寫入或讀取可能會超時。
  • 如果存在網絡問題,則可能會超時或出現某種SocketException。

如果以上均未發生,則表明您的服務是“有效的”,盡管對於您發送的請求來說,它可能僅是“有效的”。

顯然,您還需要檢查預期的響應。 例如,在有用的意義上,為每個請求發送501或503響應的HTTP服務並不活躍。


這是做什么用的-如果我在“ localhost”上進行測試,那么isReachable是否可以工作(即,不是真正的網絡示例,只有一台機器)?

我認為沒有明確的答案。 這取決於操作系統是否在回送網絡地址上支持ICMP協議。 我不希望它起作用,因為AFAIK在回送時沒有ICMP的實際用例。

暫無
暫無

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

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