2010-02-09 111 views
7

在Java中,我需要獲取用於同一程序的多個實例之間通信的端口號。 現在,我可以簡單地選擇一些固定的數字,並與它一起去。但是我想知道是否有辦法動態選擇端口號,這樣我就不必爲設置端口號而困擾我的用戶了。動態選擇端口號?

這裏是我有一個想法,它的工作原理是這樣的:

  • 有一個固定的初始端口號A.
  • 計劃「MyApp的」開始,試圖搶口A.
  • 如果成功,那麼它就是'MyApp'的第一個實例。完成。
  • 如果失敗,它會通過端口A詢問A上的程序是否爲'MyApp'的實例。如果是,則與該實例進行通信。完成。如果不是,請嘗試抓取端口A + 1。如果有另一個程序使用該端口(不是'MyApp'的實例),那麼抓住A + 2,然後抓住A + 3,等等。

此策略是否有意義?還是有更好的方法來動態選擇一個端口號?

+1

你不需要這樣做。如果您創建套接字,系統會自動爲您分配下一個可用的端口號。請仔細閱讀您正在使用的套接字API的文檔。還提供更多關於您正在使用的編程語言/庫的標籤。 – 2010-02-09 18:39:16

+0

@dma_k:在Java中,顯然你必須綁定到端口0來實現(反直覺,我知道)。如果你根本不綁定,你將無法聽到它。 :-P – 2010-02-09 18:41:36

+0

幾乎所有我能記得的socket實現使用這個「反直覺」技巧來請求一個動態分配的端口......這裏沒什麼特別的。 – jldupont 2010-02-09 18:48:10

回答

26

如果綁定到端口0,則Java將使用系統生成的端口。 :-)所以,如果你已經使用了你想要的端口,這可能是最簡單的方法。

ServerSocket s = new ServerSocket(0); 
int port = s.getLocalPort(); // returns the port the system selected 
+2

...以及實例如何找到對方?這不就是問題的全部? – jldupont 2010-02-09 18:46:30

3

我會採取相反的做法,併爲您的應用程序選擇一個固定的高端口。將其設置爲配置值,以便在必要時進行更改。這將簡化配置,因爲應用程序的用戶通常需要請求網絡操作來打開端口。圍繞IANA分配的值工作:

http://www.iana.org/assignments/port-numbers

掃描端口,可以把你的應用程序變成一個壞公民對許多入侵檢測系統。

1

您可以使用Bonjour/ZeroConf來通告每個實例的服務並使實例能夠找到其他實例。將其視爲目錄服務,它可以幫助管理您的端口名稱空間。

在這種情況下,每個實例只能獲取動態分配的端口。綁定到端口「0」的請求通常會指示系統分配一個動態端口。