java aio socket_java核心学习(三十三) 网络编程---AIO实现异步Socket通信
AIO需要操作系統(tǒng)的支持,在linux內(nèi)核2.6版本中加入了對真正異步IO的支持,java從jdk1.7開始支持AIO
核心類有AsynchronousSocketChannel 、AsynchronousServerSocketChannel、AsynchronousChannelGroup
前兩個(gè)個(gè)類是javaAIO為TCP通信提供的異步Channel。看名字就知道應(yīng)該是干什么的了。
創(chuàng)建AsynchronousServerSocketChannel的代碼如下:
AsynchronousServerSocketChannel serverChannel = AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(PORT));
其中open()有一個(gè)重載方法,可以使用指定的AsynchronousChannelGroup來創(chuàng)建AsynchronousServerSocketChannel。
AsynchronousChannelGroup是異步Channel的分組管理器,它可以實(shí)現(xiàn)資源共享。創(chuàng)建AsynchronousChannelGroup時(shí),需要傳入一個(gè)ExecutorService,也就是綁定一個(gè)線程池,該線程池負(fù)責(zé)兩個(gè)任務(wù):處理IO事件和觸發(fā)CompletionHandler回調(diào)接口。代碼如下:
AsynchronousServerSocketChannel serverSocketChannel = null;try{
ExecutorService executorService= Executors.newFixedThreadPool(80);
AsynchronousChannelGroup channelGroup=AsynchronousChannelGroup.withThreadPool(executorService);
serverSocketChannel= AsynchronousServerSocketChannel.open(channelGroup).bind(new InetSocketAddress(9000));
}catch(IOException ioe){
ioe.printStackTrace();
}
AsynchronousServerSocketChannel創(chuàng)建成功后,類似于ServerSocket,也是調(diào)用accept()方法來接受來自客戶端的連接,由于異步IO實(shí)際的IO操作是交給操作系統(tǒng)來做的,用戶進(jìn)程只負(fù)責(zé)通知操作系統(tǒng)進(jìn)行IO和接受操作系統(tǒng)IO完成的通知。所以異步的ServerChannel調(diào)用accept()方法后,當(dāng)前線程不會(huì)阻塞,程序也不知道accept()方法什么時(shí)候能夠接收到客戶端請求并且操作系統(tǒng)完成網(wǎng)絡(luò)IO,為解決這個(gè)問題,AIO為accept方法提供兩個(gè)版本:
Future accept() :開始接收客戶端請求,如果當(dāng)前線程需要進(jìn)行網(wǎng)絡(luò)IO(即獲得AsynchronousSocketChannel),則應(yīng)該調(diào)用該方法返回的Future對象的get()方法,但是get方法會(huì)阻塞該線程,所以這種方式是阻塞式的異步IO。
void accept(A attachment ,CompletionHandler handler):開始接受來自客戶端請求,連接成功或失敗都會(huì)觸發(fā)CompletionHandler對象的相應(yīng)方法。其中AsynchronousSocketChannel就代表該CompletionHandler處理器在處理連接成功時(shí)的result是AsynchronousSocketChannel的實(shí)例。
而CompletionHandler接口中定義了兩個(gè)方法,
completed(V result , A attachment):當(dāng)IO完成時(shí)觸發(fā)該方法,該方法的第一個(gè)參數(shù)代表IO操作返回的對象,第二個(gè)參數(shù)代表發(fā)起IO操作時(shí)傳入的附加參數(shù)。
faild(Throwable exc, A attachment):當(dāng)IO失敗時(shí)觸發(fā)該方法,第一個(gè)參數(shù)代表IO操作失敗引發(fā)的異常或錯(cuò)誤。
使用第一種accept方法需要如下代碼
while (true){
Future future =serverSocketChannel.accept();
AsynchronousSocketChannel socketChannel= null;try{
socketChannel=future.get();
socketChannel.write(ByteBuffer.wrap("ssss".getBytes("UTF-8")));
}catch(Exception e){
e.printStackTrace();
}
}
通常使用第二種accept,實(shí)現(xiàn)自己的CompletionHandler實(shí)現(xiàn)類。
而AsynchronousSocketChannel的的用法與Socket類似,由三個(gè)方法,但是不同的是每個(gè)方法又分為Future版本與CompletionHandler版本。
connect():用于連接到指定端口,指定IP地址的服務(wù)器
read()、write():完成讀寫。
注意!使用異步Channel時(shí),accept()、connect()、read()、write()等方法都不會(huì)阻塞,也就是說如果使用返回Future的這些方法,程序并不能直到什么時(shí)候成功IO,必須要使用get方法,等get方法的阻塞結(jié)束后才能確保IO完成,繼續(xù)執(zhí)行下面的操作。
總結(jié)
以上是生活随笔為你收集整理的java aio socket_java核心学习(三十三) 网络编程---AIO实现异步Socket通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 管理instance_对于多
- 下一篇: zookeeper 密码_Dubbo、Z