[英]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();
我想到了。 我希望這對這里的任何人都有幫助:解決方案是執行以下操作:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.