@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();
????//?注冊(cè)連接事件
????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結(jié)束后,我末尾打印的selectionKeySet.size()方法,本來(lái)是0,結(jié)果循環(huán)一遍siez卻變成1了,仍然會(huì)不停的進(jìn)入selectionKey.isReadable()方法,導(dǎo)致死循環(huán)最后iterator應(yīng)該是移除掉了,但集合里面總有一個(gè)SelectionKeyImp的對(duì)象,這個(gè)是哪里來(lái)的?我末尾打印的selectionKeySet.size()方法,本來(lái)是0,結(jié)果循環(huán)一遍又這是控制臺(tái):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=====
添加回答
舉報(bào)
0/150
提交
取消