Как увеличить максимальное количество подключений к Serversocket? - PullRequest
0 голосов
/ 26 февраля 2019

Я хочу проверить ограничение соединений ServerSocket.

Это мой сервер:

import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Server{
  public static void main(String[] args) throws Exception{
    ServerSocket server = new ServerSocket(8088);
    ArrayList<Socket> connsList = new ArrayList<Socket>();
    while(true){
      connsList.add(server.accept());
      System.out.println(connsList.size());
    }
  }
}

Это мой клиент:

import java.net.Socket;
import java.util.*;

public class Client{
  public static void main(String[] args) throws Exception{
    for(int i = 3000; i < 60000; i++){
      try{
        Socket con = new Socket("localhost", 8088);
      }catch(Exception e){
      }
    }
  }
}

После запускаэтот код, когда соединения увеличиваются, сервер был отключен, когда размер ArrayList составляет около 4000.

...
4031
4032
4033
4034
4035
4036
4037
4038
Exception in thread "main" java.net.SocketException: Too many open files in system (Accept failed)
        at java.base/java.net.PlainSocketImpl.socketAccept(Native Method)
        at java.base/java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:459)
        at java.base/java.net.ServerSocket.implAccept(ServerSocket.java:551)
        at java.base/java.net.ServerSocket.accept(ServerSocket.java:519)
        at Server.main(Server.java:11)

Кажется, что один сервер может содержать только около 4k соединений.

Есть ли какие-то, чтобы увеличить эточисло?

Env

$ java --version
java 10 2018-03-20
Java(TM) SE Runtime Environment 18.3 (build 10+46)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)

в macOS.

1 Ответ

0 голосов
/ 26 февраля 2019

Эта проблема связана не с java.net.ServerSocket, а с вашей файловой системой и с тем, сколько файловых дескрипторов (FD) может быть открыто одновременно.

$ ulimit -n

Проверьте это из терминала.Вероятно, это число, похожее на 4000.

$ ulimit -n <value>

Чтобы изменить сумму.

Использование этой команды не изменяет ulimit навсегда, и то, как именно это сделать, зависит от того, какую операционную систему вы используете, поэтому я не могу дать точное решение.

...