【问题标题】:How many connections can selector in java.nio select one at a time?java.nio 中的选择器一次可以选择多少个连接?
【发布时间】:2011-05-13 17:11:31
【问题描述】:

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

【问题讨论】:

  • 糟糕,我确定我在草稿预览中看到了正确的格式,但结果是这样的。很抱歉造成混乱......

标签: java sockets connection ioexception apache-mina


【解决方案1】:

据我所知,对于选择器可以选择的通道数量没有记录限制。通常,Integer.MAX_VALUE 或类似的东西会有一个实现限制。对于这种特殊情况,我认为限制在于 SelectorProvider 的实现方式,我敢打赌它在大多数 JVM 上都是原生的......

相关问题:

相关文章:

【讨论】:

    【解决方案2】:

    您可能只是使服务器超载。由于操作系统和 CPU 的限制,它一次只能接受这么多的请求。一旦 ServerSocket 上的挂起请求数超过监听队列长度,连接将被拒绝。

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

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

    【讨论】:

    • 赞成,但您不应该在网络代码中添加睡眠。它只喜欢问题,不解决问题。
    猜你喜欢
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 2017-08-20
    相关资源
    最近更新 更多