java AIO示例

来源:互联网 发布:linux php 目录权限 编辑:程序博客网 时间:2024/05/21 06:11

BIO:同步阻塞IO操作、NIO:同步非阻塞IO操作、AIO:异步非阻塞IO操作。

NIO通过监听请求,处理请求,之后返回结果,属于同步操作。AIO监听请求,后台应用程序处理请求(这个时候监听器继续监听请求),回调结果。后端的应用只是处理等待队列中的请求,这样请求处理和执行任务就分离了,实现异步操作。

AIO是异步IO的缩写,虽然NIO在网络操作中,提供了非阻塞的方法,但是NIO的IO行为还是同步的。对于NIO来说,我们的业务线程是在IO操作准备好时,得到通知,接着就由这个线程自行进行IO操作,IO操作本身是同步的。

但是对AIO来说,则更加进了一步,它不是在IO准备好时再通知线程,而是在IO操作已经完成后,再给线程发出通知。因此AIO是不会阻塞的,此时我们的业务逻辑将变成一个回调函数,等待IO操作完成后,由系统自动触发。

下面的程序是通过AIO来实现一个简单的EchoServer以及对应的客户端。

在AIO socket编程中,服务端通道是AsynchronousServerSocketChannel,这个类提供了一个open()静态工厂,一个bind()方法用于绑定服务端IP地址(还有端口号),另外还提供了accept()用于接收用户连接请求。在客户端使用的通道是AsynchronousSocketChannel,这个通道处理提供open静态工厂方法外,还提供了read和write方法。

在AIO编程中,发出一个事件(accept read write等)之后要指定事件处理类(回调函数),AIO中的事件处理类是CompletionHandler<V,A>,这个接口定义了如下两个方法,分别在异步操作成功和失败时被回调。

   void completed(Vresult, Aattachment);

   void failed(Throwableexc, Aattachment);


说了这么多,感觉很像Ajax中的回调方法,只不过换成了类。直接看代码吧:

服务端:

[java] view plain copy
print?
  1. import java.io.IOException;  
  2. import java.net.InetSocketAddress;  
  3. import java.nio.ByteBuffer;  
  4. import java.nio.channels.AsynchronousServerSocketChannel;  
  5. import java.nio.channels.AsynchronousSocketChannel;  
  6. import java.nio.channels.CompletionHandler;  
  7. import java.util.concurrent.ExecutionException;  
  8. import java.util.concurrent.Future;  
  9. import java.util.concurrent.TimeUnit;  
  10. import java.util.concurrent.TimeoutException;  
  11.   
  12. public class AIOEchoServer {  
  13.   
  14.     public final static int PORT = 8001;  
  15.     public final static String IP = "127.0.0.1";  
  16.   
  17.       
  18.     private AsynchronousServerSocketChannel server = null;  
  19.       
  20.     public AIOEchoServer(){  
  21.         try {  
  22.             //同样是利用工厂方法产生一个通道,异步通道 AsynchronousServerSocketChannel  
  23.             server = AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(IP,PORT));  
  24.         } catch (IOException e) {  
  25.             e.printStackTrace();  
  26.         }  
  27.     }  
  28.       
  29.     //使用这个通道(server)来进行客户端的接收和处理  
  30.     public void start(){  
  31.         System.out.println("Server listen on "+PORT);  
  32.           
  33.         //注册事件和事件完成后的处理器,这个CompletionHandler就是事件完成后的处理器  
  34.         server.accept(null,new CompletionHandler<AsynchronousSocketChannel,Object>(){  
  35.   
  36.             final ByteBuffer buffer = ByteBuffer.allocate(1024);  
  37.               
  38.             @Override  
  39.             public void completed(AsynchronousSocketChannel result,Object attachment) {  
  40.                   
  41.                 System.out.println(Thread.currentThread().getName());  
  42.                 Future<Integer> writeResult = null;  
  43.                   
  44.                 try{  
  45.                     buffer.clear();  
  46.                     result.read(buffer).get(100,TimeUnit.SECONDS);  
  47.                       
  48.                     System.out.println("In server: "new String(buffer.array()));  
  49.                       
  50.                     //将数据写回客户端  
  51.                     buffer.flip();  
  52.                     writeResult = result.write(buffer);  
  53.                 }catch(InterruptedException | ExecutionException | TimeoutException e){  
  54.                     e.printStackTrace();  
  55.                 }finally{  
  56.                     server.accept(null,this);  
  57.                     try {  
  58.                         writeResult.get();  
  59.                         result.close();  
  60.                     } catch (InterruptedException | ExecutionException e) {  
  61.                         e.printStackTrace();  
  62.                     } catch (IOException e) {  
  63.                         e.printStackTrace();  
  64.                     }  
  65.                 }  
  66.                   
  67.             }  
  68.   
  69.             @Override  
  70.             public void failed(Throwable exc, Object attachment) {  
  71.                 System.out.println("failed:"+exc);  
  72.             }  
  73.               
  74.         });  
  75.     }  
  76.       
  77.     public static void main(String[] args) {  
  78.         new AIOEchoServer().start();  
  79.         while(true){  
  80.             try {  
  81.                 Thread.sleep(1000);  
  82.             } catch (InterruptedException e) {  
  83.                 e.printStackTrace();  
  84.             }  
  85.         }  
  86.     }  
  87.   
  88. }  

客户端:

[java] view plain copy
print?
  1. import java.io.IOException;  
  2. import java.net.InetSocketAddress;  
  3. import java.nio.ByteBuffer;  
  4. import java.nio.channels.AsynchronousSocketChannel;  
  5. import java.nio.channels.CompletionHandler;  
  6.   
  7. public class AIOClient {  
  8.   
  9.     public static void main(String[] args) throws IOException {  
  10.           
  11.         final AsynchronousSocketChannel client = AsynchronousSocketChannel.open();  
  12.           
  13.         InetSocketAddress serverAddress = new InetSocketAddress("127.0.0.1",8001);  
  14.           
  15.         CompletionHandler<Void, ? super Object> handler = new CompletionHandler<Void,Object>(){  
  16.   
  17.             @Override  
  18.             public void completed(Void result, Object attachment) {  
  19.                 client.write(ByteBuffer.wrap("Hello".getBytes()),null,   
  20.                         new CompletionHandler<Integer,Object>(){  
  21.   
  22.                             @Override  
  23.                             public void completed(Integer result,  
  24.                                     Object attachment) {  
  25.                                 final ByteBuffer buffer = ByteBuffer.allocate(1024);  
  26.                                 client.read(buffer,buffer,new CompletionHandler<Integer,ByteBuffer>(){  
  27.   
  28.                                     @Override  
  29.                                     public void completed(Integer result,  
  30.                                             ByteBuffer attachment) {  
  31.                                         buffer.flip();  
  32.                                         System.out.println(new String(buffer.array()));  
  33.                                         try {  
  34.                                             client.close();  
  35.                                         } catch (IOException e) {  
  36.                                             e.printStackTrace();  
  37.                                         }  
  38.                                     }  
  39.   
  40.                                     @Override  
  41.                                     public void failed(Throwable exc,  
  42.                                             ByteBuffer attachment) {  
  43.                                     }  
  44.                                       
  45.                                 });  
  46.                             }  
  47.   
  48.                             @Override  
  49.                             public void failed(Throwable exc, Object attachment) {  
  50.                             }  
  51.                       
  52.                 });  
  53.             }  
  54.   
  55.             @Override  
  56.             public void failed(Throwable exc, Object attachment) {  
  57.             }  
  58.               
  59.         };  
  60.           
  61.         client.connect(serverAddress, null, handler);  
  62.         try {  
  63.             Thread.sleep(1000);  
  64.         } catch (InterruptedException e) {  
  65.             e.printStackTrace();  
  66.         }  
  67.     }  
  68.   
  69. }  


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩嘴巴被蚊虫咬的红肿怎么办 每次洗头都掉好多头发该怎么办 关于宝宝脾不好胃口却很好怎么办 高中生掉发严重怎么办该看什么科 脱头发如何治疗 掉头发厉害怎么办 头发上突然秃了一小块怎么办 全秃过后长出来白色头发怎么办 高三学生喜欢打球影响学习怎么办 高三学生受同学搔挠学习怎么办 烫完头发掉头发很厉害怎么办 烫头发后掉头发很厉害怎么办 十八岁了下门牙活动疼痛怎么办 烫完头发后掉头发很厉害怎么办 16岁的孩孑得了肺炎怎么办 我的头发掉的很厉害怎么办 八个月宝宝头后面没头发怎么办 生完孩子掉头发很厉害怎么办 生完孩子后掉头发很厉害怎么办 头发又细又软又卷怎么办 后颈部没有头发掉光了想植发怎么办 头发掉的厉害怎么办怎么拯救掉头发 头发可以种植吗 如果是秃顶怎么办 染头发把手指甲染黑了怎么办 怀孕两个月下体流褐色分泌物怎么办 头发总是大把大把的得掉 怎么办 严重脱发怎么办去问南宁肤康 脱发严重怎么办去看南宁肤康 前额头发少怎么办 如何使头发增多 生完宝宝头发一把一把的掉怎么办 生完宝宝后头发掉的厉害怎么办 生完宝宝头发掉的厉害怎么办 生了小孩后头发掉很多怎么办 生了孩子头发掉的很厉害怎么办 母乳期头发掉的很厉害怎么办 宝宝吃母乳头发掉的厉害怎么办 头发油腻头皮屑多还掉头发怎么办 头发剪了中分刘海弯了怎么办 头发掉了长出来的头发很细怎么办? 头皮损伤毛囊怎么办还会长头发吗 一岁宝宝头发稀少怎么办能刮光头么 前编头发长了怎么办怎么梳理