public static void startServer()throws Exception { // 1 获取服务端通道 ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); // 2 切换非阻塞模式 serverSocketChannel.configureBlocking(false); // 3 创建buffer ByteBuffer byteBuffer = ByteBuffer.allocate(1024); // 4 绑定端口号 serverSocketChannel.bind(new InetSocketAddress(8080)); // 5 获取selector选择器 Selector selector = Selector.open(); // 6 通道注册到选择器,进行监听 serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); // 7 选择器进行轮询,进行后续操作 while (selector.select() > 0) { Set<SelectionKey> keys = selector.selectedKeys(); Iterator<SelectionKey> iterator = keys.iterator(); while (iterator.hasNext()) { SelectionKey key = iterator.next(); if (key.isAcceptable()) { System.err.println("accept"); // 获取连接 SocketChannel accept = serverSocketChannel.accept(); // 切换非阻塞 accept.configureBlocking(false); // 注册 accept.register(selector, SelectionKey.OP_READ); } else if (key.isReadable()) { SocketChannel channel = (SocketChannel) key.channel(); ByteBuffer readBuffer = ByteBuffer.allocate(1024); //读取数据 int len = 0; while ((len = channel.read(readBuffer)) > 0) { readBuffer.flip(); System.err.println(new String(readBuffer.array(), 0, len)); readBuffer.clear(); } System.err.println("read"); } iterator.remove(); } } }
public static void main(String[] args) throws Exception { // 绑定 ip port SocketChannel socketChannel = SocketChannel.open(); socketChannel.connect(new InetSocketAddress(8080)); // 切换非阻塞 socketChannel.configureBlocking(false); // 创建buffer ByteBuffer buffer = ByteBuffer.allocate(1024); // 写入buffer数据 Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { String txt = scanner.next(); System.out.println(txt); buffer.put(txt.getBytes(StandardCharsets.UTF_8)); // 模式切换 buffer.flip(); // 写入通道 socketChannel.write(buffer); // 清空 关闭 buffer.clear(); } }