2016-04-04 50 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虽然您可能不想这样做,但您不能在不知道要连接的主机和端口的情况下创建连接。我建议你使用一个组件/服务来帮助你管理哪些端口用于什么。 –

相关问题