Netty接收客户端连接

昨天的’Netty从0到1的运作流程’文章中我们介绍了Netty如何启动以及如何接收客户端请求, 如果有疑惑可以给我发邮件promiss217@outlook.com或者去我的个人站点https://www.infuq.com/manual/feedback.html提反馈信息.

今天我们主要讲解Netty如何接收客户端请求.

当服务端启动以后, 此时有客户端发送请求过来, 那么服务端接收到此请求, 在服务端处理IO请求的过程.

if ((readyOps & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0 || readyOps == 0) {
    unsafe.read();
}

当是ACCEPT请求时, 读取客户端连接.

@Override
protected int doReadMessages(List<Object> buf) throws Exception {
    SocketChannel ch = SocketUtils.accept(javaChannel());
    if (ch != null) {
        buf.add(new NioSocketChannel(this, ch));
        return 1;
    }

    return 0;
}

读取的JDK-Channel并封装成NioSocketChannel. 在前面的文章我们说过, 此处默认读取16个客户端. 读取之后


for (int i = 0; i < size; i ++) {
    pipeline.fireChannelRead(readBuf.get(i));
}

通过for循环依次’传给’Pipeline中. 而在NioServerSocketChannel关联的Pipeline中有个ServerBootstrapAcceptor, 它是一个处理器Handler.

public void channelRead(ChannelHandlerContext ctx, Object msg) {
    final Channel child = (Channel) msg;

    child.pipeline().addLast(childHandler);

    setChannelOptions(child, childOptions, logger);
    setAttributes(child, childAttrs);

    childGroup.register(child).addListener(new ChannelFutureListener() {
        @Override
        public void operationComplete(ChannelFuture future) throws Exception {
            if (!future.isSuccess()) {
                forceClose(child, future.cause());
            }
        }
    });
}

这个处理器会向客户端的Channel设置选项和属性.以及添加childHandler.之后会选择一个NioEventLoop, 并将Channel注册到这个NioEventLoop.

但实际的注册是以任务的形式添加到这个NioEventLoop对应的MpscQueue中.注册作为第一个任务, 也表示会启动这个NioEventLoop, 顺理成章会创建一个线程.

注册的过程会触发channelRegistered事件, channelActive事件,最后会向Selector设置READ事件. 至此客户端便可以读写IO操作了.

微信公众号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值