• 利用NIO编程知识,实现多人聊天室 ```java package io.torey.niotest;

    import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.util.Iterator; import java.util.Set;

    /**

    • NIO服务器端 */ public class NioServer { public static void main(String[] args){

      1. NioServer nioServer = new NioServer();

      }

      /**

      • 启动 */ public void start() throws IOException{ //1 创建Selector //2 通过ServerSocketChannel创建channel通道 //3 为channel通道绑定监听端口 //4 重点:设置channel为非阻塞模式 //5 将channel注册到selector上,监听连接事件 //6 循环等待新接入的连接 //7 根据就绪状态,调用对应方法处理业务逻辑
    1. //1 创建Selector
    2. Selector selector = Selector.open();
    3. //2 通过ServerSocketChannel创建channel通道
    4. ServerSocketChannel serverSocketChannel= ServerSocketChannel.open();
    5. //3 为channel通道绑定监听端口
    6. serverSocketChannel.bind(new InetSocketAddress(8000));
    7. //4 重点:设置channel为非阻塞模式
    8. serverSocketChannel.configureBlocking(false);
    9. //5 将channel注册到selector上,监听连接事件
    10. serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT);
    11. System.out.println("服务器启动成功!!");
    12. //6 循环等待新接入的连接
    13. while (true) {
    14. //这个方法是阻塞方法,获取可用的channel数量
    15. int readyChannels= selector.select();
    16. if (readyChannels==0) {
    17. continue;
    18. }
    19. //获取可用channel的集合
    20. Set<SelectionKey> selectionKeys = selector.selectedKeys();
    21. Iterator<SelectionKey> iterator = selectionKeys.iterator();
    22. while (iterator.hasNext()) {
    23. //selectionKey的实例
    24. SelectionKey selectionKey = iterator.next();
    25. //移除Set中当前的selectionKey,重点
    26. iterator.remove();
    27. //7 根据就绪状态,调用对应方法处理业务逻辑
    28. //如果是 接入事件
    29. //如果是 可读事件
    30. }
    31. }
    32. }

    }

    ```