Java ServerSocket连接限制?

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

以下程序是我的实验代码,它在当前状态下不会抛出任何exception并正常终止。 但是,如果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)造成的。 尝试再次连接到服务器之前,以毫秒为单位给出一些时间间隔。 喜欢加速连接。 当我运行测试负载时,我通过给出一些时间间隔来解决它。