簡體   English   中英

動態選擇客戶端服務器應用程序中用於連接的端口

[英]Dynamically choosing port for connection in a client server application

我有一個客戶端服務器應用程序。 當多個客戶端通過指定的端口(例如6001)連接到服務器時,我遇到了問題。 問題是,當客戶端連接到服務器時,如果我使用命令kill -9 $ pid(其中pid是服務器應用程序pid)的腳本停止服務器,那么在重新啟動服務器時,我會得到一個BIND異常-地址已經在使用表示端口6001仍然不能用於客戶端再次連接,因為客戶端無法連接到服務器。

我一直在尋找解決此問題的方法。 我想到了動態使用端口范圍的想法。

這就是我的想法:

在Xml文件中,而不是將端口號硬編碼為6001。我將提供一系列端口,例如6001-6005。 然后,當服務器啟動時,它將遍歷端口以選擇可用端口。 例如-當服務器嘗試創建綁定到指定端口6001的服務器套接字時,如果存在例外,即該端口已被另一個應用程序綁定,則它將選擇6002端口,依此類推。 無論哪個端口可用,服務器都會為其創建服務器Socket對象,並開始偵聽該端口上的客戶端。

現在類似地在客戶端,它將首先嘗試在6001上進行連接,如果失敗,則嘗試6002,依此類推,直到它連接到服務器正在偵聽的正確端口。

我的問題是這是否正確。 同樣,如果客戶端可以上述方式連接。

如果否,那么有什么辦法可以解決我上面提到的問題。

您需要這樣創建ServerSocket

ServerSocket ss = new ServerSocket(); // NB no parameters
ss.setReuseaddress(true);
ss.bind(new InetSocketAddress(port));

這告訴操作系統即使服務器處於TIME-WAIT狀態,也可以綁定服務器套接字。 如果仍然有該應用程序的先前實例在運行,那么您當然需要先將其停止。

忘記端口范圍的東西。

要查找使用端口的進程的pid,請使用

lsof -wni tcp:端口號

然后使用pid終止進程,該進程將釋放端口以供進一步使用,並且不會出現“已經使用”的使用錯誤。 這樣可以解決您的問題。 更好的做法是使用單個端口供客戶端訪問。

暫無
暫無

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

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