NIO

    @Test
    public void client() throws Exception {
        /**  获取Channel通道 **/
        SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 9999));
        /** 设置为非阻塞型 **/
        sChannel.configureBlocking(false);
        /** 分配指定大小缓冲区 **/
        ByteBuffer dst = ByteBuffer.allocate(1024);
        /** 加入数据    **/
        dst.put((new Date().toString()).getBytes());
        dst.flip();
        /** 读取并写入 **/
        sChannel.write(dst);
        /**   关闭通道  **/
        sChannel.close();
    }
  @Test
    public void server() throws Exception {
        /** 获取通道    **/
        ServerSocketChannel ssChannel = ServerSocketChannel.open();
        /** 设置非阻塞型  **/
        ssChannel.configureBlocking(false);
        /**  bind 连接   **/
        ssChannel.bind(new InetSocketAddress(9999));
        /** 获取选择器    **/
        Selector selector = Selector.open();
        /** 将通道注册到选择器中,并指定接受'监听事件'  **/
        ssChannel.register(selector, SelectionKey.OP_ACCEPT);
        /**  轮询的获取选择器上'就绪'的 事件  **/
        while (selector.select() > 0) {
            /**  获取所有当前选择器中所有的选择键 (已就绪的监听) **/
            Iterator it = selector.selectedKeys().iterator();
            while (it.hasNext()) {
                SelectionKey next = it.next();
                /** 判断具体是什么事件准备就绪,**/
                if (next.isAcceptable()) {
                    /**  若为'接受就绪',则获取连接     **/
                    SocketChannel accept = ssChannel.accept();
                    /**  并切换到非阻塞模式   **/
                    accept.configureBlocking(false);
                    /**  设置为可读   **/
                    accept.register(selector, SelectionKey.OP_READ);
                } else if (next.isReadable()) {
                    /**  若为 '读就绪',获取读就绪 通道    **/
                    SocketChannel sc = (SocketChannel)next.channel();
                    /** 分配空间    **/
                    ByteBuffer dst = ByteBuffer.allocate(1024);
                    int len = 0;
                    while ( (len = sc.read(dst)) != -1) {
                        dst.flip();
                        System.out.println(new String(dst.array(),0,len));
                        dst.clear();
                    }
                    sc.close();
                }
                /**   取消选择键 SelectKey   **/
                it.remove();
            }
        }
    }

你可能感兴趣的:(NIO)