繁体   English   中英

Java ServerSocket连接限制?

[英]Java ServerSocket connection limit?

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

以下程序是我的实验代码,该代码在当前状态下不引发任何异常并正常终止。 但是,如果Socket[] clients的数组大小增加到超过50,则服务器套接字将拒绝在第50个连接之后尝试连接的所有客户端套接字。

问题: 为什么服务器套接字拒绝套接字连接的次数为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个连接,即使它们未同时连接也是如此。

全部在JavaDoc中

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

显然,您的ServerSocket绝不接受任何连接,只是监听。 您必须调用accept()并开始处理连接或增加积压队列大小:

new ServerSocket(port, 100)

50是backlog的默认值

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

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

根据@TomaszNurkiewicz的回答,这是一个有效的示例:

import java.net.*;
import java.util.concurrent.atomic.AtomicBoolean;

public class SockTest{
public static void main(String[] args) {
    final AtomicBoolean shouldRun = new AtomicBoolean(true);
    try  {
        final ServerSocket server = new ServerSocket(2123);
        Thread serverThread = new Thread(){
           public void run() {
              try {
                 while(shouldRun.get()) {
                 Socket s = server.accept();
                 s.close();
             Thread.sleep(1);
                }
              } catch(Exception ex) {
                ex.printStackTrace();
              }
           }
        };
        serverThread.start();
        Socket[] clients = new Socket[150];
        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();
        }
        shouldRun.set(false);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
       shouldRun.set(false);
    }

  }
}

您可能会看两件事

  1. 服务器不接受连接。
  2. 服务器无法同时容纳太多连接。 这可能是由于积压的数量增加(超过50)引起的。 尝试在以毫秒为单位的间隔内再重新连接到服务器。 就像增加连接。 我通过在运行测试负载时留出一些时间间隔来解决该问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM