work hard work smart

专注于Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

NIO网络访问模式实践

Posted on 2019-08-17 14:45  work hard work smart  阅读(201)  评论(0编辑  收藏  举报

1、创建NioNest12类

一个线程监听5个端口的事件

public class NioTest12 {

    public static void main(String[] args) throws Exception {

        int[] ports = new int[5];
        ports[0] = 5000;
        ports[1] = 5001;
        ports[2] = 5002;
        ports[3] = 5003;
        ports[4] = 5004;

        Selector selector = Selector.open();

        for(int i = 0; i < ports.length; ++i){
            ServerSocketChannel serverSocketChannel =  ServerSocketChannel.open();
            serverSocketChannel.configureBlocking(false);
            ServerSocket serverSocket = serverSocketChannel.socket();
            InetSocketAddress address = new InetSocketAddress(ports[i]);
            serverSocket.bind(address);
            serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

            System.out.println("监听端口:" + ports[i]);

        }
        while (true){
            int numbers = selector.select();
            System.out.println("numbers:" + numbers);
            Set<SelectionKey> selectionKeys =  selector.selectedKeys();

            System.out.println("selectedKeys: " + selectionKeys);

            Iterator<SelectionKey> iter = selectionKeys.iterator();

            while (iter.hasNext()){
                SelectionKey selectionKey = iter.next();
                //判断是否有客户端连接
                if(selectionKey.isAcceptable()){
                    ServerSocketChannel serverSocketChannel = (ServerSocketChannel)selectionKey.channel();
                    SocketChannel socketChannel = serverSocketChannel.accept();
                    socketChannel.configureBlocking(false);
                    socketChannel.register(selector, SelectionKey.OP_READ);

                    iter.remove();

                    System.out.println("获得客户端连接:" +socketChannel);
                }
                //判断是否有可读的数据
                else if(selectionKey.isReadable()){
                    SocketChannel socketChannel = (SocketChannel) selectionKey.channel();

                    int bytesRead = 0;
                    while (true){
                        ByteBuffer byteBuffer = ByteBuffer.allocate(512);

                        int read = socketChannel.read(byteBuffer);

                        if(read <= 0){
                            break;
                        }

                        byteBuffer.flip();

                        socketChannel.write(byteBuffer);

                        bytesRead += read;

                    }

                    System.out.println("读取:" + bytesRead +",  来源于:" + socketChannel);

                    iter.remove();
                }
            }
        }

    }
}

  

 

 启动NioTest12,监听如下五个端口

 

 

使用命令行访问

2、telnet localhost 5000,并发送hello wold

输出如下:

 

 

 3、telnet localhost 5001,并发送hello wold

 

输出如下: