【问题标题】:TCP: When server listening on random port how does client know which port to send to?TCP:当服务器监听随机端口时,客户端如何知道要发送到哪个端口?
【发布时间】:2018-08-02 20:19:50
【问题描述】:

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

一些背景知识:我目前正在将系统从 UDP 转换为 TCP。我需要服务器监听随机端口的原因是我的服务器/客户端没有严格的服务器/客户端关系。因此,这种情况下的“服务器”实际上是一个应用程序,我需要在一台 PC 上打开多个实例。具有预定发送/接收端口的旧方法是导致只有一个实例能够打开一个端口,并且所有通信都被重定向到该实例。我的理解是解决这个问题的最好方法是让每个实例使用不同的端口,而最好的方法是使用 ServerSocket(0)。尽管包括了这个背景,但我不想让 cmets 知道情况有多混乱,只需要与问题相关的答案。

【问题讨论】:

  • 如果“客户端”和“服务器”在同一个网络上,您可以让“服务器”广播它们当前的 IP 和端口。 “客户端”可以接收这些广播并决定连接到哪个“服务器”。或者,在与“服务器”相同的 PC 上设置另一个侦听器并使其知道“服务器”当前端口,然后为其提供自己的固定侦听端口,供客户端连接并查询哪些“服务器”可用。

标签: java sockets tcp serversocket


【解决方案1】:

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

[或者让客户端在每次想要连接时运行端口扫描。它会起作用,但可能不会像您的用户希望的那样快。]

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2014-11-04
    • 2021-02-04
    • 2015-01-12
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多