2013-07-01 215 views
1

我在java中實現了一個客戶端服務器應用程序,它工作正常。現在,如果我做了netstat -a在外殼看到活動連接我看到有很多形式如下關閉客戶端和服務器後的孤立TCP連接

TCP 127.0.0.1:54725 Sin-Host:0 LISTENING 

例如孤兒連接的,如果我創建像下面

TCP 127.0.0.1:58185 Sin-Host:0 LISTENING 
端口58185的服務器

當客戶端連接到它,我得到兩個連接類似如下

TCP 127.0.0.1:58185 Sin-Host:0 LISTENING 
TCP 127.0.0.1:58185 Sin-Host:58187 ESTABLISHED 
TCP 127.0.0.1:58187 Sin-Host:58185 ESTABLISHED 

現在,當我關閉我的兩個客戶端和服務器的第一個連接仍然存在(即在LISTENING狀態不是TIMED_WAIT

我認爲當我關閉客戶端和服務器時,沒有理由保持第一個連接。這是一個錯誤?它並不影響我的程序,但我只是想知道,所以我知道它的影響。

**EDIT : How long do these orphans last** 

我重新啓動了我的系統,所有的孤兒都不見了。我重複了測試,發現即使在應用程序關閉後,孤兒依然存在,但系統重新啓動後仍會消失。

也許我猜這是一些系統設置,它阻止它首先進入。

+0

定義'關閉我的客戶端和服務器'。在每種情況下你是否真的退出了這個過程? – EJP

+0

@EJP by'close'我的意思是我通過關閉整個eclipse來殺死運行服務器的eclipse實例。 – rockstar

+0

它有多久一直聽? –

回答

0

只要你有一個像

serverSocket.accept(); 

在你的代碼與LISTENING連接保持一條線。

accept()導致該端口的狀態爲LISTENING

這兩個ESTABLSHED行都用於活動連接。

+0

如果整個過程退出,這不是問題的實質。在任何情況下,說''accept()導致端口的LISTENING狀態是完全不正確的。 C'listen()'API會導致LISTENING狀態:它由'ServerSocket'的構造函數調用。-1 – EJP

+0

@EJP請閱讀我對原始問題的評論。看起來程序還在運行,因此我的分析似乎是正確的... –

+0

不,這是不正確的,我已經告訴過你爲什麼。你的答案是基於錯誤的前提。我重複。它不是導致這種情況的'accept()',它是'ServerSocket'的存在和非關閉。 – EJP

相關問題