亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

资阳市| 民勤县| 昭觉县| 澄城县| 都匀市| 来凤县| 太湖县| 军事| 聊城市| 环江| 宣化县| 华蓥市| 永济市| 濮阳县| 方城县| 剑川县| 丘北县| 宝鸡市| 墨玉县| 金沙县| 建水县| 兴业县| 抚州市| 图们市| 屏南县| 玛多县| 株洲县| 南靖县| 子长县| 翁源县| 台东县| 于都县| 吴忠市| 淮安市| 鲁甸县| 正镶白旗| 得荣县| 灵寿县| 马尔康县| 莒南县| 南靖县|