zoukankan      html  css  js  c++  java
  • reactor模式前序(二):NIO WEB服务器设计

    前文介绍了传统IO的WEB经典服务器 reactor模式前序:传统IO的WEB服务器设计

    下面看看JAVA NIO的WEB服务器设计

    NIO是基于事件驱动的,对于NIO来说,重要组件是Selector,其服务器代码为:

     1 /*
     2  * 流程总结:
     3   * 1.初始时,只对accept事件感兴趣,selectionkey只有accept事件
     4   * 2.当有连接进来时,处理完accept之后,对读事件感兴趣,selectionkey增加键read
     5   * 3.不断循环selectionkey的键集合
     6  */
     7 
     8 Selector selector = Selector.open();
     9 ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
    10 serverSocketChannel.configureBlocking(false); // 设置为非阻塞
    11 
    12 // 绑定监听端口号
    13 serverSocketChannel.bind(new InetSocketAddress(8899));
    14 
    15 serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); // 对连接事件感兴趣
    16 
    17 while (true) {
    18     Set<SelectionKey> keys = selector.selectedKeys();
    19 
    20     Iterator<SelectionKey> iterator = keys.iterator();
    21 
    22     while(iterator.hasNext()) {
    23         SelectionKey selectionKey = iterator.next();
    24 
    25         if(selectionKey.isAcceptable()) {
    26             ServerSocketChannel serverSocketChannel1 = (ServerSocketChannel) selectionKey.channel();
    27             SocketChannel socketChannel = serverSocketChannel1.accept(); // 此处阻塞
    28             socketChannel.configureBlocking(false);
    29 
    30             socketChannel.register(selector, SelectionKey.OP_READ);
    31 
    32             iterator.remove();
    33         } else if(selectionKey.isReadable()) { // 完成功能:从客户端接收数据并且原样返回给客户端
    34             SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
    35 
    36             while (true) {
    37                 ByteBuffer byteBuffer = ByteBuffer.allocate(512);
    38                 byteBuffer.clear();
    39                 int read = socketChannel.read(byteBuffer);
    40 
    41                 if(read <= 0) {
    42                     break; // 数据已接收完毕
    43                 }
    44 
    45                 byteBuffer.flip();
    46                 socketChannel.write(byteBuffer);
    47 
    48             }
    49 
    50             iterator.remove();
    51 
    52         }
    53 
    54 
    55     }
    56 
    57 }
     
  • 相关阅读:
    Activity的启动模式
    Assets和Raw区别
    手机自动跑脚本
    系统隐式 Intent
    判断是否为小屏幕设备
    C语言数组初始化方式
    windows10环境下gcc环境变量的配置
    UE4.22编辑器界面操控设置(4)
    windows10下JDK9的环境配置
    分布式ID生成解决方案之snowflake(雪花算法)
  • 原文地址:https://www.cnblogs.com/billmiao/p/9872223.html
Copyright © 2011-2022 走看看