2015-08-21 80 views
1

因此,我們有一個服務器具有多個使用多個端口的應用程序。以5729,7614,9231爲例。從java中的客戶端查找使用的服務器端口

客戶端需要連接到這些端口中的一個。所有端口都處於活動狀態並等待服務器上的連接,但客戶端需要連接的服務器應用程序僅在端口7614上。其他兩個端口用於不同的應用程序。

一旦某個活動端口連接,客戶端可以在端口ping服務器,並找出它使用什麼應用程序(這是已經實現的瞭解服務器的協議和正常工作)。

的問題是,客戶端無法知道正確的端口會是哪個端口是直到它找到它和坪它的方式。服務器應用程序使用的端口不是靜態的,並且可能隨時更改(而不是我們的代碼,因此無法將其固定爲靜態)。

目前,由於我們不知道什麼端口將包含正確的端口號,我們必須通過從0到65525的每個端口遞增,嘗試連接並ping通連接的端口以確定我們是否連接到正確的應用程序。

這需要永遠。有什麼辦法可以獲得正在使用的3個端口的列表嗎?也就是說,服務器應用程序調用了新的ServerSocket(端口號)的任何端口?

這必須在java中完成。

編輯客戶端需要能夠看到服務器當前使用的端口。這個問題的一切都必須在客戶端完成。在服務器上使用文件或運行命令不是一個選項。

+0

http://stackoverflow.com/questions/21937533/checking-whether-socket-port-is-available - 我們的問題在某種程度上是類似的,雖然我沒有真正的答案... –

回答

0

選項:

  1. 更改您的設計和使用固定的端口號。掃描永遠不會起作用。你可以連接任何東西。
  2. 使用命名服務(如LDAP),並讓每個服務以其實際端口號與客戶端知道的名稱綁定到LDAP中;讓客戶端查找該名稱並使用該端口號。我不推薦這個。
  3. 寫自己的註冊服務,大有作爲一樣(2),但不必與LDAP API搏鬥:只是每個服務發送其名稱和端口號到註冊表,並有客戶問的REG敦促爲每個端口號按名稱。爲了克服糟糕的設計,這又一次需要額外的代碼。

我強烈推薦(1)。這是其他人所做的。

-1

對於客戶端連接到服務器,客戶端應該總是知道服務器端口。 但至於你的情況,服務器不斷改變端口。然後,如果您可以控制服務器設計,請將其更改爲非常糟糕的設計,否則請在服務器上提供服務器,以便客戶端可以詢問當前的服務器端口。

如果所有的這已經超出了範圍,那麼你就只剩下你已經做即掃描端口上最壞的選擇。然後,我只能說服務器端口的掃描是單獨的服務,它會繼續掃描一些心跳並保存最後一個端口。 使此服務多線程化,以便您可以並行地在多個端口上執行ping操作。 當客戶端啓動時,它可以嘗試連接上次保存的端口,如果工作正常..其他請詢問您的服務再次開始掃描。再次..這是最糟糕的設計。您還可以在客戶端設計中做的一件事是將客戶端初始化階段與服務器連接階段分離。所以如果你在等待端口掃描,你仍然可以在你的客戶端做一些有用的工作。

+0

那將運行在客戶端機器不是嗎?我需要知道服務器正在使用的端口。 – backcab