@Test
public void clientSocket() throws IOException {
SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("localhost", 9999));
socketChannel.configureBlocking(false);
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
byteBuffer.put("你好好好好".getBytes());
byteBuffer.flip();
socketChannel.write(byteBuffer);
byteBuffer.clear();
socketChannel.shutdownOutput();
socketChannel.close();
}
@Test
public void serverSocket() throws IOException {
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.bind(new InetSocketAddress(9999));
Selector selector = Selector.open();
// 注册连接事件
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (selector.select() > 0) {
Set<SelectionKey> selectionKeySet = selector.selectedKeys();
System.out.println(selectionKeySet.size());
Iterator<SelectionKey> iterator = selectionKeySet.iterator();
while (iterator.hasNext()) {
SelectionKey selectionKey = iterator.next();
if (selectionKey.isAcceptable()) {
System.out.println("accept=====");
SocketChannel socketChannel = serverSocketChannel.accept();
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
} else if (selectionKey.isReadable()) {
System.out.println("read=====");
SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
socketChannel.read(byteBuffer);
byteBuffer.flip();
System.out.println(new String(byteBuffer.array()) + ":::::::::::::::::::");
byteBuffer.clear();
}
iterator.remove();
System.out.println(selectionKeySet.size());
}
}
}在client结束后,我末尾打印的selectionKeySet.size()方法,本来是0,结果循环一遍siez却变成1了,仍然会不停的进入selectionKey.isReadable()方法,导致死循环最后iterator应该是移除掉了,但集合里面总有一个SelectionKeyImp的对象,这个是哪里来的?我末尾打印的selectionKeySet.size()方法,本来是0,结果循环一遍又这是控制台:1
[sun.nio.ch.SelectionKeyImpl@4b9e13df]
accept=====
0
1
[sun.nio.ch.SelectionKeyImpl@2b98378d]
read=====
你好好好好
0
1
[sun.nio.ch.SelectionKeyImpl@2b98378d]
read=====
0
1
[sun.nio.ch.SelectionKeyImpl@2b98378d]
read=====
0
1
[sun.nio.ch.SelectionKeyImpl@2b98378d]
read=====
0
1
[sun.nio.ch.SelectionKeyImpl@2b98378d]
read=====
添加回答
举报
0/150
提交
取消