首页 文章

Java ServerSocket连接限制?

提问于
浏览
11

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

以下程序是我的实验代码,它在当前状态下不会抛出异常并正常终止 . 但是,如果 Socket[] clients 的数组大小增加到50以上,则在第50个连接之后尝试连接的任何客户端套接字都会被服务器套接字拒绝 .

问题: Why is 50 the count at which socket connections are refused by a server socket?

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个连接,即使它们没有同时连接 .

4 回答

  • 4

    这一切都在JavaDoc

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

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

    new ServerSocket(port, 100)
    
  • 14

    50是 backlog 的默认值

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

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

  • 0

    根据@ 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);
        }
    
      }
    }
    
  • 2

    你可以看两件事

    • 服务器不接受连接 .

    • Server无法同时处理太多连接 . 这可能是由积压增加(超过50)造成的 . 尝试再次连接到服务器之前,以毫秒为单位给出一些时间间隔 . 喜欢加速连接 . 当我运行测试负载时,我通过给出一些时间间隔来解决它 .

相关问题