java.nio.channels.Selector を止める - 忘れないようにメモ
2007/08/29
java
ネットワーク
忘れないようにメモです。時間があるときにまとめたいです。
ネットワークのデータを待ちうけでこんな感じのコードを書いていました。
※適当です。
ServerSocketChannel server;
server = ServerSocketChannel.open();
server.configureBlocking(false);
server.socket().bind(new InetSocketAddress(host, port));
this.selector = Selector.open();
server.register(selector, SelectionKey.OP_ACCEPT);
server = ServerSocketChannel.open();
server.configureBlocking(false);
server.socket().bind(new InetSocketAddress(host, port));
this.selector = Selector.open();
server.register(selector, SelectionKey.OP_ACCEPT);
while (isGo) {
int n = this.selector.select();
if (n == 0) {
continue; // Nothing to do
}
Iterator i = selector.selectedKeys().iterator();
while (i.hasNext()) {
SelectionKey key = (SelectionKey) i.next();
i.remove();
if (key.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) key
.channel();
SocketChannel client = server.accept();
parseData(client.socket().getInputStream());
client.close();
}
}
}
int n = this.selector.select();
if (n == 0) {
continue; // Nothing to do
}
Iterator i = selector.selectedKeys().iterator();
while (i.hasNext()) {
SelectionKey key = (SelectionKey) i.next();
i.remove();
if (key.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) key
.channel();
SocketChannel client = server.accept();
parseData(client.socket().getInputStream());
client.close();
}
}
}
で、これを止める方法ですが、
まず
isGoをfalseにします。これでループがとまります。
つぎに、
selectorを起こします。起こしますと
selector.select()が動きだして、ループがとまっているので、whileの外にでます。
そしてつぎに、server.socket().close()にしておしまいです。
ですので、isGo,selectorとserverは外部でもつ必要がありますね。
コードはこんな感じ
isGo = false;
selector.wakeup();
server.socket().close();
多分うまくいきます。うごかしてうまくいったレベルなので、説明できないです。
あとで、調べたいと思います。
: