java.nio中有多少个连接选择器可以一次选择一个?

时间:2010-11-22 08:29:01

标签: java sockets connection ioexception apache-mina

我对新的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一次可以接受多少个连接?或者我的代码有什么问题吗?

2 个答案:

答案 0 :(得分:3)

您可能只是在重载服务器。由于操作系统和CPU限制,它一次只能接受这么多请求。一旦有超过ServerSocket上的侦听队列长度的待处理请求,连接将被拒绝。

尝试增加侦听队列长度(ServerSocket.bind()中的backlog参数)和/或在客户端中添加少量sleep()以进行循环。

我不知道Mina的详细信息,但您可能还想确保除了处理消息的线程数之外还有多个线程接受。

答案 1 :(得分:2)

从我所看到的情况来看,选择器可以选择多少个频道没有书面限制。通常会对Integer.MAX_VALUE或类似的内容实施限制。对于这种特殊情况,我假设限制在于SelectorProvider的实现方式,我敢打赌它在大多数JVM上是原生的......

相关问题:

相关文章: