我对新的 Java 套接字 NIO 做了一些研究。我正在使用 MINA 构建一个模拟服务器,它接受来自许多客户端(大约 1000 个)的连接并处理从它们接收到的数据。我还设置了客户端模拟器,它创建大约 300 个客户端连接并使用线程将数据发送到服务器。结果是某些连接被服务器中止。代码如下
try {
listener = new NioSocketAcceptor(ioThread);
listener.getFilterChain().addLast("codec", new ProtocolCodecFilter(new MessageCodecFactory()));
listener.getFilterChain().addLast("thread", new ExecutorFilter(100, 150));
listener.setHandler(new IncomingMessageHandler(serverMessageHandler));
listener.bind(new InetSocketAddress(PORT));
}
catch (IOException ioe) {
}
这里是处理程序,Session 是我的类,用于来自客户端的每个连接
@Override
public void sessionCreated(IoSession session) throws Exception {
new Session(session.getRemoteAddress(), handler, session);
super.sessionCreated(session);
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
Message m = Message.wrap((MessagePOJO)message);
if (m != null) {
Session s = SessionManager.instance.get(session.getRemoteAddress());
if (s != null) {
s.submit(m);
ArmyServer.instance.tpe.submit(s);
}
}
super.messageReceived(session, message);
}
@Override
public void sessionClosed(IoSession session) throws Exception {
Session s = SessionManager.instance.get(session.getRemoteAddress());
if (s != null)
s.disconnect();
super.sessionClosed(session);
}
和客户端模拟器,SIZE ~300 - 400
for (int i = 0; i < SIZE; i++) {
clients[i] = new Client(i);
pool[i] = new Thread(clients[i]);
pool[i].start();
}
那么问题是 Mina 一次可以接受多少个连接?还是我的代码有什么问题?
最佳答案
您可能只是让服务器重载了。由于操作系统和 CPU 的限制,它一次只能接受这么多请求。一旦挂起的请求数超过 ServerSocket 上的监听队列长度,连接将被拒绝。
尝试增加监听队列长度(ServerSocket.bind()
中的积压参数)和/或在客户端 for 循环中添加少量 sleep()。
我不知道 Mina 的详细信息,但您可能还想确保除了有多少个线程在处理消息外,您还有 1 个以上的线程接受。
关于java - java.nio 中的选择器一次可以选择多少个连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4243585/