NIO selector多路複用器

public void testScannerServer() throws IOException {
    System.out.println("服務端開啓");
    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

    // 非阻塞
    serverSocketChannel.configureBlocking(false);

    serverSocketChannel.bind(new InetSocketAddress(8092));

    Selector selector = Selector.open();

    serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

    while (selector.select() > 0) {

        Iterator<SelectionKey> it = selector.selectedKeys().iterator();

        while (it.hasNext()) {
            SelectionKey key = it.next();
            // 爲何要remove?
            // https://stackoverflow.com/questions/7132057/why-the-key-should-be-removed-in-selector-selectedkeys-iterator-in-java-ni
            it.remove();
            if (!key.isValid()) {
                System.out.println("鏈接不可用");
            } else if (key.isAcceptable()) {
                // 新鏈接
                System.out.println("服務端接受到新鏈接");
                SocketChannel socketChannel = serverSocketChannel.accept();
                socketChannel.configureBlocking(false); // 非阻塞
                socketChannel.register(selector, SelectionKey.OP_READ); // 註冊可讀事件
            } else if (key.isReadable()) {
                // 有客戶端發送數據
                SocketChannel socketChannel = (SocketChannel) key.channel();
                // 開始讀取數據
                System.out.println(new Date().toString());
                ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

                if (socketChannel.read(byteBuffer) == -1) {
                    // -1 說明客戶端關閉了寫或者直接close
                    System.out.println("客戶端關閉鏈接");
                    // socketChannel.close(); // 其實不須要調用,由於客戶端已經關閉, 爲了程序穩健性能夠開啓
                    key.cancel(); // 取消註冊
                } else {
                    byteBuffer.flip();
                    System.out.println(new String(byteBuffer.array(), 0, byteBuffer.limit()));
                    byteBuffer.clear();
                }
            }
        }
    }
}
相關文章
相關標籤/搜索