TCP:当服务器在随机端口上侦听时,客户端如何知道要发送到哪个端口?

时间:2018-02-22 20:28:21

标签: java sockets tcp serversocket

问题:在java中,您可以使用ServerSocket(0)在服务器上创建一个套接字,它将选择一个随机端口来监听。但是,当您在客户端上创建套接字以使用Socket(addr,port)发送消息时,没有明显的方法可以确定您需要发送到服务器上的哪个端口。除了基本的“如果你输了0它会选择一个随机端口”之外,我无法通过网络搜索找到关于此选项的任何信息。有没有人知道或有资源可以解释这种情况应该从客户端看起来像什么?

一些背景知识:我目前正在将系统从UDP转换为TCP。我需要服务器在随机端口上侦听的原因是我的服务器/客户端没有严格的服务器/客户端关系。所以这种情况下的“服务器”实际上是一个应用程序,我需要在一台PC上打开多个实例。具有预定发送/接收端口的旧方法仅使一个实例能够打开端口并且所有通信都被重定向到该实例。我的理解是,解决此问题的最佳方法是每个实例使用不同的端口,最好的方法是执行ServerSocket(0)。尽管有这样的背景,但我不希望评论情况如何搞砸,只有答案与问题有关。

2 个答案:

答案 0 :(得分:0)

也许如果您与所有服务器/客户端位于同一IP子网上,那么您可以使用UPnP来指示运行应用程序的新实例的哪个随机端口,同样其他实例可以监视UPnP以发现此新实例。 我从未在Java中实现UPnP,但怀疑库存在那里.. 例如。 https://github.com/jupnp/jupnp

答案 1 :(得分:0)

如果固定端口号不是服务器记录的设置/协议的一部分,那么客户端弄清楚的唯一方法是让运行/活动服务器在某些数据存储中发布该信息,其位置和详细信息是记录并由客户端知道,以及客户端可以访问该数据存储的位置。

[或者让客户端每次想要连接时都运行portscan。它可以工作,但可能没有用户想要的那么快。]

你的情况确实搞砸了。