2016-04-04 95 views
0

我想讓用戶可以自由選擇特定的本地地址來連接到目標服務器,因爲可能存在自定義的路由策略,但希望程序選擇一個臨時端口而不是指定一個端口,因爲這可能需要手動測試本地端口的可用性。Java Socket:如何將特定本地地址綁定到沒有指定端口號的套接字

我檢查了「Socket」和「InetSocketAddress」的構造函數,看起來他們沒有一個能夠完成上述任務(即使它可以同時拾取本地地址和短暫端口),也沒有方法在初始化之後這樣做。

回答

0

有一個construtor

public Socket(InetAddress address, 
    int port, 
    InetAddress localAddr, 
    int localPort) 
    throws IOException 

,應該是適合你的需求。如果localPort爲0,系統將選擇一個空閒端口。

+0

嗨@ammoQ,此構造需要指定將localPort。 – howToDeleteMyAccount

+0

嗨@ammoQ,對不起,我沒有注意到你最後一句話。讓我測試一下。 – howToDeleteMyAccount

+0

謝謝@ammoQ,是的,這是有效的。但是由於我的排名低,我無法爲你+1。 – howToDeleteMyAccount

1

您可以創建一個Socket並稍後調用它。

Socket socket = new Socket(); // no idea where to connect 

socket.connect(addressAndPort); // now I know. 

我要做的就是有一個TCPRegistry用於測試目的。該組件負責處理別名端口。例如host.port1。它爲服務器提供了一個短暫的端口,並允許客戶端使用相同的字符串連接到它。

注意:爲了允許客戶端在服務器之前啓動,我可以要求它在單元測試中預先構建這些ServerSocket。

最後,在測試結束時,我可以檢查所有套接字和服務器套接字是否關閉,或強制清理它們。

它是專爲NIO,但可以適用於普通IO TCPRegistry

+0

你好@Peter,通過「連接」它指定對等節點(服務器)的地址和端口。我想要做的是在不指定本地端口的情況下指定/綁定本地地址。不指定本地端口的原因不僅是爲了避免本地端口可用性測試,而且爲了避免在進行多套接字連接時維護佔用/釋放端口列表。 – howToDeleteMyAccount

+0

@zipper雖然您可能不想這樣做,但您不能在不知道要連接的主機和端口的情況下創建連接。我建議你使用一個組件/服務來幫助你管理哪些端口用於什麼。 –

相關問題