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(); } } } } }