reactor模式前序(二):NIO WEB服务器设计

本文介绍Java NIO WEB服务器的设计原理及实现过程,重点讲解Selector组件如何通过事件驱动方式处理客户端连接请求与数据交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

 

/*
 * 流程总结:
  * 1.初始时,只对accept事件感兴趣,selectionkey只有accept事件
  * 2.当有连接进来时,处理完accept之后,对读事件感兴趣,selectionkey增加键read
  * 3.不断循环selectionkey的键集合
 */

Selector selector = Selector.open();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false); // 设置为非阻塞

// 绑定监听端口号
serverSocketChannel.bind(new InetSocketAddress(8899));

serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); // 对连接事件感兴趣

while (true) {
    Set<SelectionKey> keys = selector.selectedKeys();

    Iterator<SelectionKey> iterator = keys.iterator();

    while(iterator.hasNext()) {
        SelectionKey selectionKey = iterator.next();

        if(selectionKey.isAcceptable()) {
            ServerSocketChannel serverSocketChannel1 = (ServerSocketChannel) selectionKey.channel();
            SocketChannel socketChannel = serverSocketChannel1.accept(); // 此处阻塞
            socketChannel.configureBlocking(false);

            socketChannel.register(selector, SelectionKey.OP_READ);

            iterator.remove();
        } else if(selectionKey.isReadable()) { // 完成功能:从客户端接收数据并且原样返回给客户端
            SocketChannel socketChannel = (SocketChannel) selectionKey.channel();

            while (true) {
                ByteBuffer byteBuffer = ByteBuffer.allocate(512);
                byteBuffer.clear();
                int read = socketChannel.read(byteBuffer);

                if(read <= 0) {
                    break; // 数据已接收完毕
                }

                byteBuffer.flip();
                socketChannel.write(byteBuffer);

            }

            iterator.remove();

        }


    }

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值