AIO(异步非阻塞)AIO采用了Proactor模式,AIO与NIO的不同之处在于当AIO在进行读写操作时,不用先等通知,可直接调用相应的read/write方法,这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序,而NIO的通知是发生在动作之前的,是在可读、写的时候,Selector发现了这些事件后调用Handler处理.

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

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

void completed(V result, A attachment);

void failed(Throwable exc, A attachment);

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

客户端:

    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. public class AIOClient {
    7. public static void main(String[] args) throws IOException {
    8. final AsynchronousSocketChannel client = AsynchronousSocketChannel.open();
    9. InetSocketAddress serverAddress = new InetSocketAddress("127.0.0.1",8001);
    10. CompletionHandler<Void, ? super Object> handler = new CompletionHandler<Void,Object>(){
    11. @Override
    12. public void completed(Void result, Object attachment) {
    13. client.write(ByteBuffer.wrap("Hello".getBytes()),null,
    14. new CompletionHandler<Integer,Object>(){
    15. @Override
    16. public void completed(Integer result,
    17. Object attachment) {
    18. final ByteBuffer buffer = ByteBuffer.allocate(1024);
    19. client.read(buffer,buffer,new CompletionHandler<Integer,ByteBuffer>(){
    20. @Override
    21. public void completed(Integer result,
    22. ByteBuffer attachment) {
    23. buffer.flip();
    24. System.out.println(new String(buffer.array()));
    25. try {
    26. client.close();
    27. } catch (IOException e) {
    28. e.printStackTrace();
    29. }
    30. }
    31. @Override
    32. public void failed(Throwable exc,
    33. ByteBuffer attachment) {
    34. }
    35. });
    36. }
    37. @Override
    38. public void failed(Throwable exc, Object attachment) {
    39. }
    40. });
    41. }
    42. @Override
    43. public void failed(Throwable exc, Object attachment) {
    44. }
    45. };
    46. client.connect(serverAddress, null, handler);
    47. try {
    48. Thread.sleep(1000);
    49. } catch (InterruptedException e) {
    50. e.printStackTrace();
    51. }
    52. }
    53. }

java中的AIO的更多相关文章

  1. 再谈一次关于Java中的 AIO(异步IO) 与 NIO(非阻塞IO)

    今天用ab进行压力测试时,无意发现的: Requests per second:    xxx [#/sec] (mean) ab -n 5000 -c 1000 http://www:8080/up ...

  2. Java中的IO、NIO、File、BIO、AIO详解

    java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?         Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包 ...

  3. 深入理解Java AIO(三)—— Linux中的AIO实现

    我们调用的Java AIO底层也是要调用OS的AIO实现,而OS主要也就Windows和Linux这两大类,当然还有Solaris和mac这些小众的. 在 Windows 操作系统中,提供了一个叫做 ...

  4. 京东数科二面:常见的 IO 模型有哪些?Java 中的 BIO、NIO、AIO 有啥区别?

    IO 模型这块确实挺难理解的,需要太多计算机底层知识.写这篇文章用了挺久,就非常希望能把我所知道的讲出来吧!希望朋友们能有收货!为了写这篇文章,还翻看了一下<UNIX 网络编程>这本书,太 ...

  5. 京东数科面试真题:常见的 IO 模型有哪些?Java 中的 BIO、NIO、AIO 有啥区别?

    本文节选自<Java面试进阶指北 打造个人的技术竞争力> 面试中经常喜欢问的一个问题,因为通过这个问题,面试官可以顺便了解一下你的操作系统的水平. IO 模型这块确实挺难理解的,需要太多计 ...

  6. Java 中的纤程库 – Quasar

    来源:鸟窝, colobu.com/2016/07/14/Java-Fiber-Quasar/ 如有好文章投稿,请点击 → 这里了解详情 最近遇到的一个问题大概是微服务架构中经常会遇到的一个问题: 服 ...

  7. 【笔试题】Java 中如何递归显示一个目录下面的所有目录和文件?

    笔试题 Java 中如何递归显示一个目录下面的所有目录和文件? import java.io.File; public class Test { private static void showDir ...

  8. Java NIO学习系列六:Java中的IO模型

    前文中我们总结了linux系统中的5中IO模型,并且着重介绍了其中的4种IO模型: 阻塞I/O(blocking IO) 非阻塞I/O(nonblocking IO) I/O多路复用(IO multi ...

  9. Java NIO之Java中的IO分类

    前言 前面两篇文章(Java NIO之理解I/O模型(一).Java NIO之理解I/O模型(二))介绍了,IO的机制,以及几种IO模型的内容,还有涉及到的设计模式.这次要写一些更贴近实际一些的内容了 ...

随机推荐

  1. 洛谷 题解 P1550 【[USACO08OCT]打井Watering Hole】

    本题看似很难,实际上思路非常简单--如果你想通了. 首先有一个问题:图中有几个点?大部分的人会回答\(n\)个点.错了,有\(n+1\)个. 多出来的那个点在哪?关键在于你要理解每一个决策的意义.实际 ...

  2. npm use local module

    情况是这样的, 我一个Angular的项目和一个微信小程序要共用逻辑, 于是我就把它剥离出来一个Node类库, Angular倒是可以使用Reference去引用, 但是使用uniapp创建的微信小程 ...

  3. [转帖]JVM—深入理解内存模型与垃圾收集机制

    JVM—深入理解内存模型与垃圾收集机制 https://juejin.im/post/5d68dc9ee51d4561ad6548f7 前言 Java是一种跨平台的语言,当初其设计初衷也是为了解决各个 ...

  4. netty-websocket简单的使用方法

    最便捷使用netty-websocket方法 1.pom添加依赖 <dependency> <groupId>org.yeauty</groupId> <ar ...

  5. Python29之字符str与字节bytes

    详解见这位大神:https://www.cnblogs.com/xiaobingqianrui/p/9870480.html 实际上字符串和字节之间的转换过程,就是编码解码的过程,我们必须显示的指定编 ...

  6. WUSTOJ 1324: Base64 Coding(Java)未解决,求题解

    题目链接:1324: Base64 Coding 资料:ASCII码表 原文是英文,而且篇幅较长.因此下面不粘贴原文,只写中文大意. Description Base64是一种编码算法.它的工作原理是 ...

  7. luogu P4887 莫队二次离线

    珂朵莉给了你一个序列$a$,每次查询给一个区间$[l,r]$ 查询$l≤i<j≤r$,且$ai⊕aj$的二进制表示下有$k$个$1$的二元组$(i,j)$的个数.$⊕$是指按位异或. 直接暴力莫 ...

  8. MyBatis Generator 自动生成的POJO对象的使用(一)

    MyBatis Generator 会自动生成以下几种类型的对象(除非你使用MyBatis3DynamicSql 的运行环境): Java Model Objects(总是生成) SQL Map Fi ...

  9. java influx DB工具类

    配置 application-properties: spring.influxdb.url=${influxdb_host:127.0.0.1} spring.influxdb.port=${inf ...

  10. 3_PHP表达式_1_常量

    以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. PHP常量分为自定义常量与预定义常量. 1.自定义常量 在使用前必须先定义,PHP的define()函数专门用于定 ...