5

在服务器端,我使用以下代码:

ServerSocket server = new ServerSocket(1234);
Socket server_socket = server.accept();

我发现服务器正在侦听端口 1234。

当连接一个或多个客户端套接字时,它们都使用相同的端口 1234 !

这真是令人困惑:

在此处输入图像描述

我记得多插座不能使用同一个端口,不是吗?谢谢。

4

1 回答 1

11

TCP 连接由四个数字标识:

  • 客户端(或对等体 1)IP
  • 服务器(或对等 2)IP
  • 客户端端口
  • 服务器端口

一个典型的 TCP 连接打开如下:

  • 客户端 IP 由客户端的 ISP 或 NAT 提供。
  • 服务器 IP 由用户提供或在 DNS 中查找。
  • 客户端从未分配的范围中任意选择一个端口(同时避免重复的四倍体)
  • 服务器端口由协议或明确给出。

您在 ServerSocket 中指定的端口是客户端连接的端口。它只不过是操作系统知道的属于您的应用程序的端口号以及将事件从操作系统传递到您的应用程序的对象。

ServerSocket#accept方法返回一个Socket. Socket 是包装单个 TCP 连接的对象。即客户端IP、服务器IP、客户端TCP端口和服务器TCP端口(以及一些传递相关数据的方法)

客户端发送的第一个 TCP 数据包必须包含您的应用程序侦听的服务器端口,否则操作系统将不知道该连接属于哪个应用程序。

此外,没有动机将服务器 TCP 端口切换到另一个数字。它对服务器机器或客户端机器没有帮助,它需要一些开销来执行(您需要一起发送新的和旧的 TCP 端口),并且还有额外的开销,因为服务器操作系统无法再通过以下方式识别应用程序单个端口 - 它需要将应用程序与其使用的所有服务器端口相关联(客户端仍然需要这样做,但典型客户端的连接比典型服务器少)


你看到的是

  • 两个入站连接,属于服务器(本地端口:1234)。Socket每个在服务器应用程序中都有自己的。
  • 两个出站连接,属于客户端(远程端口:1234)。每个在客户端应用程序中都有自己Socket的。
  • 一个监听连接,属于服务器。这对应于ServerSocket接受连接的单。

由于它们是环回连接,因此您可以在一台机器上看到两个端点混合在一起。您还可以在本地端和远程端看到两个不同的客户端端口(52506 和 52511)。

于 2012-12-30T15:30:21.657 回答