<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] # Selector ![](https://img.kancloud.cn/54/ec/54ec00fcc198c888a126544de6d5e9ea_675x408.png) **選擇器是NIO的核心,它是channel的管理者** 通過執行select()阻塞方法,監聽是否有channel準備好 一旦有數據可讀,此方法的返回值是SelectionKey的數量 所以服務端通常會死循環執行select()方法,直到有channl準備就緒,然后開始工作 每個channel都會和Selector綁定一個事件,然后生成一個SelectionKey的對象. 利用Selector可以使一個單獨的線程管理多個Channel ~~~ SelectableChannel |-----SocketChannel |-----ServerSocketChannel |-----DatagramChannel ~~~ # 需要注意的是 **channel和Selector綁定時,channel必須是非阻塞模式** **而FileChannel不能切換到非阻塞模式,因為它不是套接字通道,所以FileChannel不能和Selector綁定事件** 在NIO中一共有四種事件: 1. SelectionKey.OP_CONNECT:連接事件 2. SelectionKey.OP_ACCEPT:接收事件 3. SelectionKey.OP_READ:讀事件 4. SelectionKey.OP_WRITE:寫事件 # 常用方法 ![](https://img.kancloud.cn/21/27/2127187f244fddeb27e52f561c4b49f2_683x303.png) # 代碼 ~~~ public class NonBlockingNIOTest { @Test public void client() throws Exception{ InetAddress addr = InetAddress.getByName("127.0.0.1"); SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress(addr, 9090)); //設置當前Channel為非阻塞式的 socketChannel.configureBlocking(false); Scanner scanner = new Scanner(System.in); //使用Channel實現數據的讀寫 ByteBuffer byteBuffer = ByteBuffer.allocate(1024); while(scanner.hasNext()){ String line = scanner.nextLine(); SocketAddress address = socketChannel.getLocalAddress(); byteBuffer.put((address + "-" + new Date() + ":\n" + line).getBytes()); byteBuffer.flip(); socketChannel.write(byteBuffer); byteBuffer.clear(); } socketChannel.close(); } @Test public void server() throws Exception{ ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); //serverSocketChannel設置為非阻塞的 serverSocketChannel.configureBlocking(false); //設置serverSocketChannel的端口號 serverSocketChannel.bind(new InetSocketAddress(9090)); //獲取Selector Selector selector = Selector.open(); //注冊Selector,表明可以接收客戶端的數據 serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); SocketChannel socketChannel = null; while(selector.select() > 0){ Iterator<SelectionKey> iterator = selector.selectedKeys().iterator(); while(iterator.hasNext()){ SelectionKey selectionKey = iterator.next(); if(selectionKey.isAcceptable()){//表示當前可以接收客戶端數據 //接收到客戶端發送來的socketChannel socketChannel = serverSocketChannel.accept(); //設置socketChannel為非阻塞的 socketChannel.configureBlocking(false); //注冊 socketChannel.register(selector, SelectionKey.OP_READ); }else if(selectionKey.isReadable()){//表示可以讀取客戶端的數據 //讀取SocketChannel中的數據 socketChannel = (SocketChannel) selectionKey.channel(); ByteBuffer byteBuffer = ByteBuffer.allocate(1024); while(socketChannel.read(byteBuffer) > 0){ byteBuffer.flip(); System.out.println(new String(byteBuffer.array(),0,byteBuffer.limit())); byteBuffer.clear(); } } } iterator.remove(); } socketChannel.close(); serverSocketChannel.close(); selector.close(); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看