簡體   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