Java ServerSocket 连接限制?

2022-09-04 08:35:02

我使用套接字运行了一些测试,并且遇到了一些奇怪的行为:ServerSocket 将在第 50 个客户端套接字连接到它之后拒绝连接,即使该客户端套接字在打开下一个客户端套接字之前已关闭,即使连接之间添加了延迟。

以下程序是我的实验性代码,在当前状态下,它不会引发任何异常并正常终止。但是,如果阵列大小增加到 50 以上,则服务器套接字将拒绝在第 50 次连接后尝试连接的任何客户端套接字。Socket[] clients

问:为什么 50 是服务器套接字拒绝套接字连接的计数?

public static void main(String[] args) {
    try (ServerSocket server = new ServerSocket(2123)) {
        Socket[] clients = new Socket[50];
        for (int i = 0; i < clients.length; i++) {
            clients[i] = new Socket("localhost", 2123);
            System.out.printf("Client %2d: " + clients[i] + "%n", i);
            clients[i].close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我运行过另外50个套接字连接到另一个本地服务器的测试,并且打开和关闭100个套接字时没有发生任何问题,所以我推断出它是服务器套接字拒绝连接,而不是打开客户端套接字的一些限制,但是我无法发现为什么服务器套接字限制为50个连接, 即使它们不是同时连接的。


答案 1

这一切都在JavaDoc中:

传入连接指示(连接请求)的最大队列长度设置为 50。如果在队列已满时到达连接指示,则连接将被拒绝。

显然,你永远不会接受任何联系,只是倾听。您必须调用并开始处理连接,或者增加积压队列大小:ServerSocketaccept()

new ServerSocket(port, 100)

答案 2

50 是backlog

http://docs.oracle.com/javase/1.4.2/docs/api/java/net/ServerSocket.html#ServerSocket%28int%29

传入连接指示(连接请求)的最大队列长度设置为 50。如果在队列已满时到达连接指示,则连接将被拒绝。


推荐