簡體   English   中英

Java Socket類說謊關於連接狀態

[英]Java Socket class is lying regarding connection status

我們有一個Java客戶端,該客戶端使持久的套接字連接保持與遠程服務器的連接。 客戶端每15秒輪詢一次數據庫表,如果有新項,它將進行序列化並將其寫入套接字。

在寫入輸出流之前,我想檢查套接字連接是否仍然良好。 對於特定的應用程序邏輯,進行這種主動檢查比捕獲異常並進行反應式重新連接要容易得多。

我使用以下代碼找出斷開連接時可以讓我知道的方法:

LOG.debug("Socket status: bound=" + _socket.isBound() + ", closed=" + _socket.isClosed() + ", connected=" + _socket.isConnected() + ", outputShutdown=" + _socket.isOutputShutdown() + ", inputShutdown=" + _socket.isOutputShutdown());

我短暫地禁用了我的網絡適配器,並且在下次輪詢期間,正如預期的那樣,寫入套接字時發生了異常。

但是,調試語句打印以下內容:

"Socket status: bound=true, closed=false, connected=true, outputShutdown=false, inputShutdown=false"

我期望關閉要么為真,要么為假。 我得到的實際價值似乎是個謊言。

有沒有一種方法可以可靠地檢查套接字的連接狀態?

仔細閱讀Socket類Javadoc

如果套接字能夠連接,則isConnected為true。 方法名稱是錯誤的名稱,如果它具有hasConnected ,它將更准確。

一旦套接字成功連接,它將變為true並保持為true。 對於isBound同樣如此。 您必須嘗試執行套接字操作並檢查是否失敗。

我對此不是100%的確定,但是我可以肯定,底層的BSD套接字API實際上沒有確定TCP流是否仍處於打開狀態的機制。 read()write()失敗是一種非常可靠的方式來告知流已被拆除。

Elliot Rusty Harold撰寫的Java Network Programming提供了以下寶石:

“ ...要判斷套接字當前是否打開,您需要檢查isConnected()返回true,isClosed()返回false。例如:

boolean connected = socket.isConnected() && ! socket.isClosed();"

希望這可以幫助。

暫無
暫無

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

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