2013-08-17 69 views
2

我的情況:爪哇 - 檢查端口在使用中無需連接到它

我在同一時間運行兩個線程,一個線程需要等待,直到一個端口在使用由其他線程,它將在到達使用該端口的點之前通過一定數量的步驟。

我必須承諾的另一個限制是線程在到達打開端口之前經過的步驟與其他線程之間沒有簡單的通信,因爲它是在使用API​​的JNI本機c代碼中(希望不適用於這個問題,通過一個大的方法,它的運行)

問:

有沒有辦法爲Java能夠等到端口在使用?我已經看過了stackoverflow的解決方案,但他們有幾個問題:

  1. 創建一個新的套接字將導致該端口被使用,我的另一個線程將無法訪問此套接字。
  2. 使用netstat解析器從項目中移除可移植性。

如果我忽略了一個stackoverflow答案,請責罵我無法搜索或什麼的,任何東西都會有所幫助。

+0

你可以使用一個易變的布爾標誌,例如'private volatile boolean portInUse',在打開端口之前由線程設置,並在關閉端口後被清除? –

+0

你自己寫了C代碼嗎?如果是這樣,你可以讓它主動告訴你的其他「監視線程」它正在做什麼。 – Xabster

回答

5

有沒有辦法爲Java能夠等到端口在使用?

不在純Java中。

但假設兩個線程運行在同一個JVM中,它們可以通過其他方式進行通信。因此,您可以使用共享標誌(例如易變的布爾變量或AtomicBoolean)或CountDownLatchSemaphore。你可以使用其中的任何一個來實現一個簡單的線程(實際上)告訴另一個線程正在使用該端口。

(事實上,如果你想一個線程等待爲別的,閂鎖是最好的選擇。)


這是不是這樣的事情,這將是很容易做到的JNI。 AFAIK,netstat程序不使用正常的系統調用來執行此操作。我認爲它使用「/ proc」樹或者(在舊實現中)直接訪問內核內存來獲取它所需要的信息。你可以在本地庫中複製它,但我懷疑你會找到一個現有的庫來執行此操作。當然,Windows的實現將完全不同......

+0

+1無法理解爲什麼這還沒有被提高更多:/ – Bohemian

+0

謝謝,我會調查這些變量,因爲在我看來,這是問題的可能答案。 – apollow

1

您是否考慮過或探索過Apache camel?這裏是來自apache駱駝的示例代碼來檢查端口可用性。代碼非常簡單,乾淨:

/** 
* Checks to see if a specific port is available. 
* 
* @param port the port to check for availability 
*/ 
public static boolean available(int port) { 
    if (port < MIN_PORT_NUMBER || port > MAX_PORT_NUMBER) { 
     throw new IllegalArgumentException("Invalid start port: " + port); 
    } 

    ServerSocket ss = null; 
    DatagramSocket ds = null; 
    try { 
     ss = new ServerSocket(port); 
     ss.setReuseAddress(true); 
     ds = new DatagramSocket(port); 
     ds.setReuseAddress(true); 
     return true; 
    } catch (IOException e) { 
    } finally { 
     if (ds != null) { 
      ds.close(); 
     } 

     if (ss != null) { 
      try { 
       ss.close(); 
      } catch (IOException e) { 
       /* should not be thrown */ 
      } 
     } 
    } 

    return false; 
} 

代碼源:http://svn.apache.org/viewvc/camel/trunk/components/camel-test/src/main/java/org/apache/camel/test/AvailablePortFinder.java?view=markup#l130

+1

這需要對套接字進行控制,並且這是OP中不存在的要求。 – Xabster

+0

不,它無法打開服務器套接字,如果其他應用程序正在使用它。 –

+2

Juned Ahsan,他希望單獨離開另一個線程,並讓該線程隨時控制套接字,並且想知道它何時被使用。他不想佔用它,只檢查。 – Xabster

1

只需嘗試連接到它,然後休眠/重試幾次,直到成功。沒有神奇的成功預測指標。