我跑与插座几个测试,我遇到了一些奇怪的行为:时,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()
,并开始处理连接或增加backlog队列的大小:
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);
}
}
}