在这些情况下,ServerSocket 的行为究竟如何



假设我们有一个ServerSocket,我们运行accept()。客户端连接并使用与 ServerSocket 相同的本地端口创建新套接字。假设客户端将数据发送到此套接字。它到达端口,并到达 java 应用程序。此处的数据如何到达正确的套接字?

假设两台计算机通过 NAT 隐藏在同一个公共 IP 后面,这最终会产生问题吗?看起来好像同一台计算机正在尝试创建连接(相同的公共 IP 和相同的端口)我觉得我在这里错过了什么。

套接字将本地地址和端口与远程地址和端口连接起来。这是关键:只要端口不同,您就可以接受来自同一 IP 的多个连接。(例如,您可以在两个不同的浏览器选项卡中打开同一网页,因为它们与两个不同的客户端端口连接。

NAT 负责确保来自两台独立计算机的两个连接接收不同的地址/端口组合。如果它们映射到同一公共 IP,NAT 将需要为这些连接分配不同的本地端口。作为服务器,您不必担心这一点:您只需要看到两个不同的地址/端口组合连接到服务器的地址/端口,因此它们是不同的套接字。

在Java中,ServerSocket充当入口点。它绑定到服务器的地址和端口,因此它是"半个套接字"的模板。当客户端使用其地址和端口连接时,将创建一个"完整"Socket,其中一半已填充,现在服务器和客户端可以开始通信。如果还不够清楚,请查看TCP/UDP连接的工作原理。

不能有两台具有相同对(IP、端口)的服务器。如果在 NAT 后面,NAT 应为每个本地服务器分配不同的公共端口,则无法将其分配给两者。

最新更新