Java的ServerSocket的连接限制?(Java ServerSocket connecti

2019-07-01 09:30发布

我跑与插座几个测试,我遇到了一些奇怪的行为:时,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个连接,即使他们没有同时连接。

Answer 1:

这一切都在的JavaDoc :

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

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

new ServerSocket(port, 100)


Answer 2:

50是作为默认值backlog

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

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



Answer 3:

下面是工作的,按照@ 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);
    }

  }
}


Answer 4:

两件事情,你可以看

  1. 服务器不接受连接。
  2. 服务器无法满足在同一时刻太多的连接。 这可能是由积压增加(超过50)引起的。 尝试重新连接到服务器之前再次给人以毫秒的一些时间间隔。 就像斜坡上升的连接。 我通过给一些时间上的差距,当我跑测试负载解​​决它。


文章来源: Java ServerSocket connection limit?