8

これは非常に簡単な質問ですが、Java用のソケットチャネルを見下ろすセレクターの登録を解除する必要があることがわかりました。

SocketChannel client = myServer.accept(); //forks off another client socket
client.configureBlocking(false);//this channel takes in multiple request
client.register(mySelector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);//changed from r to rw

プログラムの後半で次のようなものを呼び出すことができます

client.deregister(mySelector);

また、セレクターはそのソケットチャネルのデータキーをキャッチしなくなります。これにより、サーバー/クライアントの設計を考えると、作業がはるかに楽になります。

4

2 に答える 2

25

cancel()選択キーを呼び出します。

SelectionKey key = client.register(mySelector,
    SelectionKey.OP_READ | SelectionKey.OP_WRITE);
...
key.cancel();

また

...
SelectionKey key = client.keyFor(mySelector);
key.cancel();
于 2012-12-13T20:04:13.293 に答える
4

@Nikolaiの答えに加えて。これを行うclient.close()と、チャネルの登録も解除されます。

キーは、チャネルを閉じるか、cancelメソッドを呼び出すことによってキャンセルされると、セレクターのキャンセルされたキーセットに追加されます。

https://docs.oracle.com/javase/7/docs/api/java/nio/channels/Selector.htmlから

于 2016-10-04T22:17:55.420 に答える