我想让用户可以自由选择特定的本地地址来连接到目标服务器,因为可能有自定义的路由策略,但是希望程序选择一个短暂的端口而不是指定一个,因为可能需要手动测试本地端口可用性。
我检查了“Socket”和“InetSocketAddress”的构造函数,似乎没有一个人可以执行上述任务(即使它可以同时获取本地地址和短暂端口),并且没有方法在初始化之后这样做。
答案 0 :(得分:1)
您可以稍后创建一个Socket并在其上调用connect。
Socket socket = new Socket(); // no idea where to connect
socket.connect(addressAndPort); // now I know.
我所做的是有一个TCPRegistry用于测试目的。该组件负责别名端口。例如host.port1
。它在服务器上为它提供了一个短暂的端口,并允许客户端使用相同的字符串连接到它。
注意:要允许客户端在服务器之前启动,我可以要求它在单元测试中预先构建这些ServerSocket。
最后,在测试结束时,我可以检查所有套接字和ServerSockets是否已关闭,或强行清理它们。
它专为NIO设计,但可以适用于普通IO TCPRegistry
答案 1 :(得分:0)
有一个建设者
public Socket(InetAddress address,
int port,
InetAddress localAddr,
int localPort)
throws IOException
应该适合您的要求。如果localPort为0,系统将选择一个空闲端口。