我想讓用戶可以自由選擇特定的本地地址來連接到目標服務器,因爲可能存在自定義的路由策略,但希望程序選擇一個臨時端口而不是指定一個端口,因爲這可能需要手動測試本地端口的可用性。Java Socket:如何將特定本地地址綁定到沒有指定端口號的套接字
我檢查了「Socket」和「InetSocketAddress」的構造函數,看起來他們沒有一個能夠完成上述任務(即使它可以同時拾取本地地址和短暫端口),也沒有方法在初始化之後這樣做。
我想讓用戶可以自由選擇特定的本地地址來連接到目標服務器,因爲可能存在自定義的路由策略,但希望程序選擇一個臨時端口而不是指定一個端口,因爲這可能需要手動測試本地端口的可用性。Java Socket:如何將特定本地地址綁定到沒有指定端口號的套接字
我檢查了「Socket」和「InetSocketAddress」的構造函數,看起來他們沒有一個能夠完成上述任務(即使它可以同時拾取本地地址和短暫端口),也沒有方法在初始化之後這樣做。
有一個construtor
public Socket(InetAddress address,
int port,
InetAddress localAddr,
int localPort)
throws IOException
,應該是適合你的需求。如果localPort爲0,系統將選擇一個空閒端口。
您可以創建一個Socket並稍後調用它。
Socket socket = new Socket(); // no idea where to connect
socket.connect(addressAndPort); // now I know.
我要做的就是有一個TCPRegistry用於測試目的。該組件負責處理別名端口。例如host.port1
。它爲服務器提供了一個短暫的端口,並允許客戶端使用相同的字符串連接到它。
注意:爲了允許客戶端在服務器之前啓動,我可以要求它在單元測試中預先構建這些ServerSocket。
最後,在測試結束時,我可以檢查所有套接字和服務器套接字是否關閉,或強制清理它們。
它是專爲NIO,但可以適用於普通IO TCPRegistry
你好@Peter,通過「連接」它指定對等節點(服務器)的地址和端口。我想要做的是在不指定本地端口的情況下指定/綁定本地地址。不指定本地端口的原因不僅是爲了避免本地端口可用性測試,而且爲了避免在進行多套接字連接時維護佔用/釋放端口列表。 – howToDeleteMyAccount
@zipper雖然您可能不想這樣做,但您不能在不知道要連接的主機和端口的情況下創建連接。我建議你使用一個組件/服務來幫助你管理哪些端口用於什麼。 –
嗨@ammoQ,此構造需要指定將localPort。 – howToDeleteMyAccount
嗨@ammoQ,對不起,我沒有注意到你最後一句話。讓我測試一下。 – howToDeleteMyAccount
謝謝@ammoQ,是的,這是有效的。但是由於我的排名低,我無法爲你+1。 – howToDeleteMyAccount