很诡异的nio非阻塞通信
我先把代码贴出来吧
public class AServer {public static void main(String[] args) throws Exception {ServerSocketChannel server = ServerSocketChannel.open();server.configureBlocking(false);server.socket().bind(new InetSocketAddress(8080));Selector selector = Selector.open();server.register(selector, SelectionKey.OP_ACCEPT);while (true) {selector.select();System.out.println("selector.select()---------" + selector.select());//readKeys集合Iterator<SelectionKey> iter = selector.selectedKeys().iterator();while (iter.hasNext()) {SelectionKey key = iter.next();iter.remove();if (key.isAcceptable()) {System.out.println("acceptable");//ServerSocketChannel ssc = (ServerSocketChannel) key.channel();SocketChannel client = server.accept();client.configureBlocking(false);client.register(selector, SelectionKey.OP_READ);} else if (key.isReadable()) {System.out.println("this server is readable");}}}}}
public class AClient {public static void main(String[] args) throws Exception {SocketChannel client = SocketChannel.open();client.configureBlocking(false);Selector selector = Selector.open();client.register(selector, SelectionKey.OP_CONNECT);client.connect(new InetSocketAddress("localhost", 8080));while (true) {selector.select();//readKeysIterator<SelectionKey> iter = selector.selectedKeys().iterator();while (iter.hasNext()) {SelectionKey key = iter.next();iter.remove();if (key.isConnectable()) {//System.out.println("connnect");SocketChannel socket = (SocketChannel) key.channel();socket.configureBlocking(false);//socket.register(selector, SelectionKey.OP_READ);//System.out.println("client is connected");} else if (key.isReadable()) {System.out.println("client is read");}}}}}
SelectionKey key = iter.next();iter.remove();这个之后,key不是被删除了么,不应该出现很多次
if (key.isConnectable()) {//System.out.println("connnect");SocketChannel socket = (SocketChannel) key.channel();socket.configureBlocking(false);//socket.register(selector, SelectionKey.OP_READ);//System.out.println("client is connected");}这里面打印的内容呀
SocketChannel client = server.accept();client.configureBlocking(false);client.register(selector, SelectionKey.OP_READ);执行了这段代码,client注册SelectionKey.OP_READ为可读的操作,是服务器端和客户端的key都是Readable可读的?如果是可读的为什么在AClient中没有打印
System.out.println("client is read");这句呀。