[英]Java ServerSocket connection limit?
我正在使用套接字运行一些测试,但遇到了一些奇怪的行为: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个连接,即使它们未同时连接也是如此。
全部在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);
}
}
}
您可能会看两件事
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.