当前位置: 首页 > 知识库问答 >
问题:

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

谷梁星雨
2023-03-14

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

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

共有2个答案

邵骁
2023-03-14

也许,如果您与所有服务器/客户端位于同一IP子网中,那么您可以使用UPnP来通知应用程序的哪个随机端口新实例正在运行,类似地,其他实例可以监视UPnP来发现这个新实例。我从来没有在Java中实现过UPnP,但是有一些可疑的库。。如。https://github.com/jupnp/jupnp

鲁斯伯
2023-03-14

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

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

而且你的情况确实是一团糟。

 类似资料:
  • 当您没有在客户端的io.connect()函数中指定端口时,客户端将监听哪个端口? 例如: 我问的原因是因为我在Heroku上部署了这个应用程序的服务器端。前端是一个IOS应用程序。我在前端使用的objective C socketIO库(https://github.com/pkyeck/socket.io-objc)要求我指定一个端口。但我不确定应该监听哪个端口,因为这在服务器端不是静态的。

  • 它是简单的java套接字客户端/服务器模型(服务器发送数据,客户端接收)。问题是当客户端关闭时,服务器发送数据的位置(服务器不会检测客户端是否关闭)。我知道服务器可以检测并关闭流,但我想知道它的去向。

  • 我正在创建我的产品,并与这个问题。有一天,我设置了Socket.io,一切都很好。第二天,我将服务器和客户端从http迁移到HTTPS。迁移后客户端和服务器端仍然连接,但不能从客户端发射到服务器,从服务器发射到客户端。 我的ssl证书位于和中,它们加载正确。运行在上的服务器 我的示例react组件。我的react应用程序运行在上。HTTPS连接良好,工作良好。 我该怎么办?也许我在中错误地使用了s

  • 我需要实现一个TCP服务器,它基本上应该在与客户端握手时打开一个套接字。 套接字打开后服务器需要保持套接字打开,并且能够通过打开的套接字将消息从服务器推送到客户端 我查看了一些spring集成示例,但不确定我所看到的示例是否确实参考了我的需求。 1. Spring集成tcp是否有这种能力来保持打开套接字并将消息从服务器发送到客户端? 服务器还应支持传入请求 客户端实现是作为简单Tcp java客户

  • 创建 TCP 客户端 最简单的方法来创建一个 TCP 客户端,使用默认选项如下所示: NetClient client = vertx.createNetClient(); 配置 TCP 客户端 如果你不想使用默认值,则创建TCP 客户端时,通过传入NetClientOptions实例可以配置: NetClientOptions options = new NetClientOptions().s