91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中怎么實現AIO異步網絡編程

發布時間:2021-06-30 17:24:53 來源:億速云 閱讀:157 作者:Leah 欄目:大數據

Java中怎么實現AIO異步網絡編程,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

AIO中的A即Asynchronous,AIO即異步IO。它是異步非阻塞的,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啟動線程進行處理,一般我們的業務處理邏輯會變成一個回調函數,等待IO操作完成后,由系統自動觸發。

在進行讀寫操作時,只需直接調用API的read/write方法即可。這兩種方法均為異步的,對于讀操作而言,當有流可讀取時,操作系統會將可讀的流傳入read方法的緩沖區,并通知應用程序;對于寫操作而言,當操作系統將write方法傳遞的流寫入完畢時,操作系統主動通知應用程序。即可以理解為,read/write方法都是異步的,完成后會主動調用回調函數。

AIO其實是對NIO的增強,新增了許多支持異步的類如AsynchronousServerSocketChannel,AsynchronousChannel,AsynchronousChannelGroup,CompletionHandler等。

在Linux系統中AIO和NIO的底層實現都是epoll,epoll本身是輪詢模型,AIO只不過是對epoll又包了一層,而在windows系統中AIO是通過IOCP(完成端口)實現。而目前大多數的服務器都是Linux系統,這也是Netty中使用NIO而非AIO的一個原因,在實際使用中由于操作系統的差異,AIO的性能有時并沒有NIO高效,因此AIO的使用并沒有很廣泛。

AIO服務端代碼示例:

public class AIOServer {

 public static void main(String[] args) throws IOException {

   // 多線程版本
   //    ExecutorService executorService = Executors.newCachedThreadPool();
   //    AsynchronousChannelGroup channelGroup =
   //        AsynchronousChannelGroup.withCachedThreadPool(executorService, 1);
   //      AsynchronousServerSocketChannel serverSocketChannel =
   //              AsynchronousServerSocketChannel.open(channelGroup).bind(new
   // InetSocketAddress(8080));

   // 單線程版本
   AsynchronousServerSocketChannel serverSocketChannel =
       AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(8080));

   serverSocketChannel.accept(
       null,
       new CompletionHandler<AsynchronousSocketChannel, Object>() {
         @Override
         public void completed(AsynchronousSocketChannel client, Object attachment) {
           serverSocketChannel.accept(null, this);
           try {
             System.out.println(client.getRemoteAddress());
             ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
             client.read(
                 byteBuffer,
                 byteBuffer,
                 new CompletionHandler<Integer, ByteBuffer>() {
                   @Override
                   public void completed(Integer result, ByteBuffer attachment) {
                     attachment.flip();
                     byte[] content = new byte[attachment.limit()];
                     attachment.get(content);
                     System.out.println(new String(content));
                     try {
                       System.out.println("Client: " + client.getRemoteAddress());
                     } catch (IOException e) {
                       e.printStackTrace();
                     }
                   }

                   @Override
                   public void failed(Throwable exc, ByteBuffer attachment) {
                     System.out.println("failed: " + exc.getMessage());
                   }
                 });

           } catch (Exception e) {
             e.printStackTrace();
           }
         }

         @Override
         public void failed(Throwable exc, Object attachment) {}
       });

   while (true) {
     try {
       Thread.sleep(1000);
     } catch (InterruptedException e) {
       e.printStackTrace();
     }
   }
 }
}

AIO客戶端代碼示例:

public class AIOClient {

 public static void main(String[] args) throws Exception {
   AsynchronousSocketChannel socketChannel = AsynchronousSocketChannel.open();
   socketChannel.connect(new InetSocketAddress("127.0.0.1", 8080));
   Thread.sleep(1000);
   ByteBuffer buffer = ByteBuffer.wrap("Hello Server".getBytes());
   socketChannel.write(buffer).get();
 }
}

看完上述內容,你們掌握Java中怎么實現AIO異步網絡編程的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

曲阜市| 马关县| 马鞍山市| 雷州市| 丽江市| 云阳县| 丁青县| 东明县| 孟津县| 新疆| 陇西县| 洱源县| 安乡县| 集安市| 沙雅县| 四平市| 会东县| 合肥市| 定安县| 太仆寺旗| 城口县| 泾川县| 尤溪县| 广州市| 汉源县| 东兰县| 花莲县| 阿拉尔市| 博湖县| 西城区| 乳源| 叶城县| 谢通门县| 普宁市| 枣强县| 广宗县| 维西| 麦盖提县| 江陵县| 白河县| 自贡市|