您好,登錄后才能下訂單哦!
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異步網絡編程的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。