Socket通信之NIO

来源:互联网 发布:java 日志 实现 编辑:程序博客网 时间:2024/05/18 02:37

这里有一个完整的示例,打开一个Selector,注册一个通道注册到这个Selector上(通道的初始化过程略去),然后持续监控这个Selector的读事件

ServerSocketChannel ssChannel = ServerSocketChannel.open();        //2. 切换非阻塞模式        ssChannel.configureBlocking(false);        //3. 绑定连接        ssChannel.bind(new InetSocketAddress(7000));        //4. 获取选择器        Selector selector = Selector.open();        //5. 将通道注册到选择器上, 并且指定“监听接收事件”        ssChannel.register(selector, SelectionKey.OP_ACCEPT);while(selector.select() > 0){            //7. 获取当前选择器中所有注册的“选择键(已就绪的监听事件)”            Iterator<SelectionKey> it = selector.selectedKeys().iterator();            while(it.hasNext()){                System.out.println(it.hasNext());                //8. 获取准备“就绪”的是事件                SelectionKey sk = it.next();                //9. 判断具体是什么事件准备就绪                if(sk.isAcceptable()){                    //10. 若“接收就绪”,获取客户端连接                    SocketChannel sChannel = ssChannel.accept();                    //11. 切换非阻塞模式                    sChannel.configureBlocking(false);                    //12. 将该通道注册到选择器上                    sChannel.register(selector, SelectionKey.OP_READ);                                    }else if(sk.isReadable()){                    //13. 获取当前选择器上“读就绪”状态的通道                    SocketChannel sChannel = (SocketChannel) sk.channel();                    //14. 读取数据                    ByteBuffer buf = ByteBuffer.allocate(1024);                    int len = 0;                    try{                        while((len = sChannel.read(buf)) > 0 ){                            buf.flip();                            // 构建一个byte数组                              byte[] content = new byte[buf.limit()];                              // 从ByteBuffer中读取数据到byte数组中                              buf.get(content);                             System.out.println("rcv:"+bytesToHexString(content));                            buf.clear();                        }                        buf  = ByteBuffer.wrap(hexStringToBytes(sendstr.toUpperCase()));                            sChannel.write(buf);                    }catch(Exception e){                    }                }                //15. 取消选择键 SelectionKey                it.remove();            }        }
1 0