【问题标题】:Java client socket returned by ServerSocket.accept()ServerSocket.accept() 返回的 Java 客户端套接字
【发布时间】:2012-08-07 23:52:45
【问题描述】:

这更像是一个通用的套接字问题。在 Java 中,如果我有一个绑定到特定端口的 ServerSocket,比如 4444,我知道它正在侦听连接请求。 accept() 方法阻塞,直到收到连接请求并返回一个新的 Socket 与客户端通信。返回的 Socket 的远程端点是客户端的 IP 地址和端口。

但是,我感到困惑的是,返回的 Socket 的本地端口与正在侦听请求的 ServerSocket 的端口号相同(在本例中为 4444)。我以为两个套接字不能绑定到同一个端口?返回的 Socket 不会是服务器上的不同端口吗?

【问题讨论】:

    标签: java sockets networking tcp port


    【解决方案1】:

    两个 ServerSocket 不能监听相同的 IP 地址和端口。可以让两个 ServerSockets 监听不同的 IP 和相同的端口。

    本地和远程的两个套接字不能具有相同的 IP 和端口。如果远程 IP 和端口不同,许多 Socket 的本地端口可以相同。

    【讨论】:

    • 我明白了。所以,理论上,如果我是一个客户端,通过 2 个套接字连接到 2 个不同的服务器,那么只要端点不同,临时端口(由系统分配)可能是相同的?我从来没有真正看到这种情况发生,但理论上它可以工作吗?
    • 我相信是这样,但我也从未见过。
    • 你不会在出站连接上看到它,因为在内核中 bind() 在 connect() 之前,即使是隐式的,并且在执行时不知道连接目标,所以它必须找到当给定一个零端口号时,一个空闲的本地端口号。
    【解决方案2】:

    您不能在给定的 IP:port 组合上使用多个套接字侦听,但可以存在多个接受到同一组合的连接。

    连接由本地 IP 地址和端口以及远程 IP 地址和端口的组合来标识。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多