如果检测到连接断开,那么 select 循环就会不断有 read 过来。但我现在对这种情况,有点疑问。
package NonBlocking;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
public class TestDisconnectClient {
static SocketChannel socketChannel = null;
static Selector selector = null;
public static void main(String[] args) throws IOException {
socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1",8888));
socketChannel.configureBlocking(false);
selector = Selector.open();
socketChannel.register(selector, SelectionKey.OP_READ);
int result = 0; int i = 1;
while((result = selector.select()) > 0) {
System.out.println(String.format("selector %dth loop, ready event number is %d", i++, result));
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
while (iterator.hasNext()) {
SelectionKey sk = iterator.next();
if (sk.isReadable()) {
System.out.println("有数据可读");
SocketChannel canReadChannel = (SocketChannel)sk.channel();
ByteBuffer buf = ByteBuffer.allocate(1024);
try {
while (canReadChannel.read(buf) > 0) {
buf.flip();
System.out.println(new String(buf.array()));
buf.clear();
}
} catch (IOException e) {
//canReadChannel.close();
//sk.cancel();
System.out.println("检测到远程连接断开");
e.printStackTrace();
//continue;
}
}
iterator.remove();
}
}
}
}
} catch (IOException e) {
//canReadChannel.close();
//sk.cancel();
System.out.println("检测到远程连接断开");
e.printStackTrace();
continue;
}
}
iterator.remove();
} catch (IOException e) {
canReadChannel.close();
sk.cancel();
System.out.println("检测到远程连接断开");
e.printStackTrace();
continue;
}
}
iterator.remove();
如果改成如上这种,select 循环检测到一次 read 事件并抛出异常后,下一次循环继续,但会阻塞在 select 那里。
主要想请教下上面三种情况的差异的原因。
还有就是,正确处理连接断开的方法就是:canReadChannel.close();sk.cancel(); 吗
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.