繁体   English   中英

为 NIO 使用两个选择器

[英]Using two Selectors for NIO

我需要一种为 OP_READ 和 OP_ACCEPT 使用不同选择器的方法。 我遇到了一个问题,即其他连接实体之间的端口抓取器会延迟握手并导致在 OP_READ 上注册的任何人延迟。 我的解决方案是在单独的线程上处理 OP_READ 和 OP_ACCEPT,但我一直遇到问题。 我首先在这里将我的接受器(选择器)注册到我的服务器套接字通道......

ssc.register(acceptor, SelectionKey.OP_ACCEPT);

接受客户端后,我将其套接字通道注册到与接受的选择器不同的选择器:

        SocketChannel sc = ((ServerSocketChannel) key.channel()).accept();
        sc.configureBlocking(false);

        SSLEngine e = context.createSSLEngine();
        e.setUseClientMode(false);
        e.beginHandshake();
        ClientHandler c = new ClientHandler(e);
        if (doHandshake(sc, e)) {
            c.setSocketChannel(sc);
            sc.register(selector, SelectionKey.OP_READ, c);
            System.out.println("Registered socket channel to selector");
        } else {
            sc.close();
            System.out.println("Connection closed: handshake failure.");
        }

出于某种原因,OP_READ 的选择器永远不会返回任何东西,即使它应该返回任何东西(当客户端发送消息时)。 当我对 OP_READ 使用与 OP_ACCEPT 相同的选择器时,我对收到的消息没有任何问题。 具体来说,我被困在selector.select();

我想到了。 我希望这对这里的任何人都有帮助:解决方案是执行以下操作:

  1. 取消密钥。
  2. 握手后用新的选择器注册密钥。
  3. 在刚刚注册到的选择器上调用 wakeup()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM