serversocket 类如何在同一个端口上服务多个客户端连接?

Posted

技术标签:

【中文标题】serversocket 类如何在同一个端口上服务多个客户端连接?【英文标题】:How does serversocket class serve multiple client connections on same port? 【发布时间】:2011-04-13 09:19:17 【问题描述】:

当使用 Socket 类时,在某个端口上建立与服务器的 TCP 连接,但在服务器上,ServerSocket 能够为每个接受请求处理多个客户端连接,并将其委托给线程来处理请求。但是一个 ServerSocket 类怎么可能在同一个端口上接受多个 tcp 连接。

这是否意味着由操作系统决定它允许多少连接或允许的最大积压是多少,这是否可以由操作系统之上的应用程序控制(我的意思是 java 受操作系统支持的最大积压限制) 并且在 TCP 规范中是否对 backlog 连接有任何限制?

最好的问候, 凯沙夫

【问题讨论】:

参见例如this answer 在 *** 上。 【参考方案1】:

TCP 连接由一组唯一的(源 IP、源端口、目标 IP、目标端口)定义。由于服务器绑定到特定端口,它定义了这 4 个变量中的两个。只要客户端都来自不同的 IP 和/或不同的端口,这不是问题。

是的,操作系统可以控制允许的总连接数,您的程序可以进一步限制。

【讨论】:

这是否意味着我们实际上可以拥有无限个连接,而不仅仅是 65k? 不是无限的,但用完 IP/sport/dport 组合不会成为限制因素。 计算机尝试连接到自身的理论限制是否为 65536*65536 = 4294967296 个连接到自身?还是我把数学搞砸了.. 听起来很对 - 但请记住,您可以为同一台计算机设置多个 IP 地址。【参考方案2】:

它为多个客户提供服务,您可以选择同时处理多少客户。

客户端和服务器之间的连接(也称为Socket)不仅由 ServerIP/ServerPort 标识,还由 ClientIP/ClientPort/ServerIP/ServerPort 标识。

您只需要接受连接(并且通常在不同的线程中处理它们)。


默认情况下,积压大小为 50,但您可以在创建 ServerSocket 时设置它。

new ServerSocket(21, 100); //Create a server socket with a backlog of 100

资源:

javadoc - Socket Sun.com - All about sockets

【讨论】:

我不认为你可以控制backlog,你可以指定它但不能控制它,如果你认为你可以并且构造函数的第二个参数有效,那么你可以想看看在我的这个问题上 - ***.com/questions/41309474/…【参考方案3】:

运行服务器的操作系统使用远程端口号来区分到服务器的各种连接。

【讨论】:

它使用四元组。

以上是关于serversocket 类如何在同一个端口上服务多个客户端连接?的主要内容,如果未能解决你的问题,请参考以下文章

外键和引用类如何在 Hibernate 实体中一起存在?

idea java中Jformdesigner自动生成的类如何在public static void main(String[] args)}中引用

java 父类如何在运行期动态获取子类类名

建立TCP连接过程

Java 在多个服务器端口上侦听客户端尝试连接

c# 释放socket 端口