异步I/O是没有阻塞地读写数据的方法。通常在代码进行read调用时,代码会阻塞直至可供读取的数据。同样,write调用将会阻塞直至数据能够写入。

1、selector是一个对象,可以注册到很多个channel上,监听各个channel上发生的事件,并且能够根据事件情况决定channel读写,这样通过一个线程管理多个channel

创建selector:

Selector selector = Selector.open();

注册channel到selector:

channel.configureBlocking(false);

SelectionKey key = chanenl.register(selector, SelecltionKey.OP_READ_;

注意,注册channel必须设置为异步模式才可以。register调用的返回值是selectionKey。这个对象待办这个通道在此selector上的这个注册。当某个selector

通知你某个传入事件时,它是通过提高对应于该事件的SelectionKey来进行的。selectionKey还可以用于取消通过的注册

2、channel和selector

Channel channel = selectionKey.channel();

Selector selector = selectioKey.selector();

demo:

public class MultiPortEcho {

  private int ports[];

  private ByteBuffer echoBuffer = ByteBuffer.allocate(1024);

  public MultiPortEcho(int ports[]) throws IOException {

  this.ports = ports;

  go();

}

private void go() throws IOException {

  //create selector

  Selector selector = Selector.open();

  //为每个端口打开一个监听,并把这些监听注册到selector中

  for(int i = 0; i < ports.length; ++i) {

    //打开一个serverSocketChannel

    ServerSocketChannel ssc = ServerSocketChnanel.open();

    ssc.configureBlocking(false);//设置为非阻塞

    ServerSocket ss = ssc.socket();

    InetSocketAddress address = new InetSocketAddress(ports[i]);

    ss.bind(address); //监听一个端口

    //注册到selector

    SelectionKey key = ssc.register(selector, SelectionKey.OP_ACCEPT);

    System.out.println("going to listen to " + ports[i]);

  }

  while(true) {

    int num = selector.select();//返回所发生的事件的数量

    Set selectedKeys = selector.selectKeys();

    Iterator it = selectedKeys.iterator();

    while(it.hasNext()) {

      SelectionKey key = (SelectionKey)it.next();

      //监听新连接,调用readops方法,检查发生了什么类型的事件

      if((key.readyOps() & selectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) {

        //接受一个新连接

        ServerSocketChannel ssc = (ServerSocketChannel) key.channel();

        SocketChannel sc = ssc.accept();

        sc.configureBlocking(false);

        //将新连接注册到selector。

        SelectionKey newKey = sc.register(selector, SelectionKey.OP_READ);

        it.remove();

        System.out.println("got connection from " + sc);

      }else if( (key.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) {

          SocketChannel sc = (SocketChannel)key.channel();

          int bytesEchoed = 0;

          while(true) {

            echoBuffer.clear();

            int r = sc.read(echoBuffer);

            if( r <= 0 ) {

            break;

          }

          echoBuffer.flip();

          sc.write(echoBuffer);

          bytesEchoed += r;

        }

        System.out.println("echoed" + bytesEchoed + "from" + sc);

        it.remove();

        // System.out.println( "going to clear" ); // selectedKeys.clear(); // System.out.println( "cleared" );

      }

    }

    static public void main(String args2[]) throws Exception {

      String args[]={"9001","9002","9003"};

       if (args.length <= 0) {

        System.err.println("Usage: java MultiPortEcho port [port port ...]");

        System.exit(1);

       }

      int ports[] = new int[args.length];

      for (int i = 0; i < args.length; ++i) {

        ports[i] = Integer.parseInt(args[i]);

      }

      new MultiPortEcho(ports);

    }

  }

  }

}

网络编程NIO-异步的更多相关文章

  1. Java网络编程中异步编程的理解

    目录 前言 一.异步,同步,阻塞和非阻塞的理解 二.异步编程从用户层面和框架层面不同角度的理解 用户角度的理解 框架角度的理解 三.为什么使用异步 四.理解这些能在实际中的应用 六.困惑 参考文章 前 ...

  2. Java网络编程 -- NIO非阻塞网络编程

    从Java1.4开始,为了替代Java IO和网络相关的API,提高程序的运行速度,Java提供了新的IO操作非阻塞的API即Java NIO.NIO中有三大核心组件:Buffer(缓冲区),Chan ...

  3. 网络编程之异步IO,rabbitMQ笔记

    对于网络并发编程而言,多线程与多进程算是最常见的需求场景了.毕竟网站开放就是想要更多的流量访问的. 回顾 回顾下之前学过的关于线程,进程和协程的知识点 IO密集型任务--用多线程更好计算密集型任务-- ...

  4. 网络编程NIO:BIO和NIO

    BIO BIO(Blocking I/O),同步阻塞,实现模式为一个连接一个线程,即当有客户端连接时,服务器端需为其单独分配一个线程,如果该连接不做任何操作就会造成不必要的线程开销.BIO是传统的Ja ...

  5. iOS网络编程(三) 异步加载及缓存图片---->SDWebImage

    @SDWebImage提供一个UIImageView的类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征. @SDWebImage的导入1.https:// ...

  6. Java网络编程 -- AIO异步网络编程

    AIO中的A即Asynchronous,AIO即异步IO.它是异步非阻塞的,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,一般我们的业务处理逻辑会变成一个回调函数,等待IO操 ...

  7. 原生JDK网络编程- NIO之Reactor模式

    “反应”器名字中”反应“的由来: “反应”即“倒置”,“控制逆转”,具体事件处理程序不调用反应器,而向反应器注册一个事件处理器,表示自己对某些事件感兴趣,有时间来了,具体事件处理程序通过事件处理器对某 ...

  8. 原生JDK网络编程- NIO

    什么是NIO? NIO 库是在 JDK 1.4 中引入的.NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的.面向块的 I/O.NIO翻译成 no-blocking io 或 ...

  9. 网络编程之异步IO

    Linux的I/O模型有下面几种:1. 同步阻塞I/O: 用户进程进行I/O操作,一直阻塞到I/O操作完成为止.2. 同步非阻塞I/O: 用户程序可以通过设置文件描述符的属性O_NONBLOCK,I/ ...

  10. 网络编程NIO之Reactor线程模型

    目录 单Reactor线程模型 基于工作线程的Reactor线程模型 多Reactor线程模型 多Reactor线程模型示例 结束语 上篇文章中写了一些NIO相关的知识以及简单的NIO实现示例,但是示 ...

随机推荐

  1. webstorm9.0.3 注册码

    William 45550-12042010 00001SzFN0n1bPII7FnAxnt0DDOPJA INauvJkeVJBuE5bqLEznccE4tet6tr RiyoMxDK8oDY93t ...

  2. git 配置(实用)

    将公钥添加进入即可  码云是添加私钥(注意!!!!) 这个时候Git就配置好了 git clone ssh协议的仓库 就可以直接拉代码了

  3. Java反射学习-5 - 反射复制对象

    通过反射方式复制对象: package cn.tx.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Fi ...

  4. Java Web学习总结(13)Listener监听器

    一,监听器介绍 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序 ...

  5. 9.27-uname,useradd命令

    打印系统信息 [root@wen ~]# uname Linux [root@wen ~]# uname -r #内核版本 2.6.32-573.el6.x86_64 [root@wen ~]# un ...

  6. ADSL(Asymmetric Digital Subscriber Loop)技术

    上行带宽,下行带宽 宽带上行下行是指一般ADSL上网方式上行与下行速率,上行就是从电脑上传的速度,下行就是从网络上的主机下载速度,一般下行速率比较高! ADSL(Asymmetric Digital ...

  7. python-zx笔记3-函数

    一.调用函数 在交互式命令行通过help(abs)查看abs函数的帮助信息 把函数名赋给一个变量 a = abs 二.定义函数 求解方程:ax2 + bx + c = 0 # -*- coding: ...

  8. css > 的写法 html

    .userInfo-view .info .name::after { content: " "; display: inline-block; height: 12rpx; wi ...

  9. 用 Flask 来写个轻博客 (25) — 使用 Flask-Principal 实现角色权限功能

    目录 目录 前文列表 扩展阅读 Flask-Principal 使用 Flask-Principal 来实现角色权限功能 添加 Role Model 在 Manager shell 中手动的添加角色 ...

  10. l1和l2正则化

    https://blog.csdn.net/tianguiyuyu/article/details/80438630 以上是莫烦对L1和L2的理解 l2正则:权重的平方和,也就是一个圆 l1正则:权重 ...