我想测试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。
此问题与java.net.serversocket无关,而与您的文件系统以及可以同时打开的文件系统以及多少个文件描述符(FDS)。
$ ulimit -n
从终端检查一下。它可能是类似于4000的数字。
$ ulimit -n <value>
更改金额。
使用此命令不会永久更改ULIMIT,并且确切地执行该命令取决于您运行的操作系统,因此我不能提供确切的解决方案。