簡體   English   中英

動態選擇端口號?

[英]Dynamically choosing port number?

在Java中,我需要獲取一個端口號,以便在同一程序的多個實例之間進行通信。 現在,我可以簡單地選擇一些固定數字並使用它。 但是我想知道是否存在一種動態選擇端口號的方法,這樣我就不必設置端口號來打擾用戶。

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

  • 有一個固定的初始端口號A。
  • 程序“ MyApp”啟動,嘗試獲取端口A。
  • 如果成功,則為“ MyApp”的第一個實例。 做完了
  • 如果失敗,它將通過端口A詢問A上的程序是否是“ MyApp”的實例。 如果是,請與該實例通信。 做完了 如果不是,請嘗試抓住端口A + 1。 而且,如果還有另一個使用該端口的程序(也不是“ MyApp”的實例),則先獲取A + 2,然后獲取A + 3,依此類推。

這個策略有意義嗎? 還是有更好的方法動態選擇端口號?

如果綁定到端口0,則Java將使用系統生成的端口。 :-)因此,如果您已使用所需的端口,那可能是回退的最簡單方法。

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

我會反過來為您的應用選擇一個固定的高端口。 將其設置為配置值,以便在必要時可以進行更改。 這將簡化配置,因為應用程序用戶經常需要請求網絡操作來打開端口。 解決IANA分配的值:

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

掃描端口可能會使您的應用程序成為許多入侵檢測系統的不良公民。

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

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

暫無
暫無

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

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