我想让用户可以自由选择特定的本地地址来连接到目标服务器,因为可能存在自定义的路由策略,但希望程序选择一个临时端口而不是指定一个端口,因为这可能需要手动测试本地端口的可用性。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