Netty-ChannelInitializer分析



这篇文章来分析一个比较简单的handler--ChannelInitializer,这个在我们创建serverbootstrap的时候会经常用到,它用于对刚刚接收的channel进行初始化。。。


ServerBootstrap b = new ServerBootstrap();    //构建serverbootstrap对象
b.group(bossGroup, workerGroup);   //设置时间循环对象,前者用来处理accept事件,后者用于处理已经建立的连接的io
b.channel(NioServerSocketChannel.class);   //用它来建立新accept的连接,用于构造serversocketchannel的工厂类
b.childHandler(new ChannelInitializer<SocketChannel>(){      //为accept channel的pipeline预添加的inboundhandler
@Override     //当新连接accept的时候,这个方法会调用
protected void initChannel(SocketChannel ch) throws Exception {
// TODO Auto-generated method stub
ch.pipeline().addLast(new MyChannelHandler());   //为当前的channel的pipeline添加自定义的处理函数
}

});
//bind方法会创建一个serverchannel,并且会将当前的channel注册到eventloop上面,
//会为其绑定本地端口,并对其进行初始化,为其的pipeline加一些默认的handler
ChannelFuture f = b.bind(80).sync();    
f.channel().closeFuture().sync();  //相当于在这里阻塞,直到serverchannel关闭
这里我们可以说明一下它的应用场景:


(1)首先serversocketchannel中accept到socketchannel


(2)将这个用户定义的ChannelInitailizer加入到这个channel的pipeline上面去。。。这样,这个handler就可以用于处理当前这个channel上面的一些事件。。。


我们还是先来看看它的继承体系吧:

本文出处:http://www.xuebuyuan.com/2041554.html




最上面的两个接口,前一篇文章已经有讲过,这个netty的handler定义中最为顶层的接口,接下来就是adapter,其实他们都是抽象类,无非是实现前面接口的方法,而且实现的很简单。。。我们首先以ChannelStateHandlerAdapter为例子来说明:


public abstract class ChannelStateHandlerAdapter extends ChannelHandlerAdapter implements ChannelStateHandler {


    /**
     * Calls {@link ChannelHandlerContext#fireChannelRegistered()} to forward
     * to the next {@link ChannelStateHandler} in the {@link ChannelPipeline}.
     *
     * Sub-classes may override this method to change behavior.
     */
    @Override
    //调用当前的这个handler的context的fireChannelRegistered方法,相当于是会向下寻找下一个stathandler,调用其的fireChannelRegistered方法
    public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
        ctx.fireChannelRegistered();
    }


    /**
     * Calls {@link ChannelHandlerContext#fireChannelUnregistered()} to forward
     * to the next {@link ChannelStateHandler} in the {@link ChannelPipeline}.
     *
     * Sub-classes may override this method to change behavior.
     */
    @Override
    public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
        ctx.fireChannelUnregistered();
    }


    /**
     * Calls {@link ChannelHandlerContext#fireChannelActive()} to forward
     * to the next {@link ChannelStateHandler} in the {@link ChannelPipeline}.
     *
     * Sub-classes may override this method to change behavior.
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        ctx.fireChannelActive();
    }


    /**
     * Calls {@link ChannelHandlerContext#fireChannelInactive()} to forward
     * to the next {@link ChannelStateHandler} in the {@link ChannelPipeline}.
     *
     * Sub-classes may override this method to change behavior.
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        ctx.fireChannelInactive();
    }
    /**
     * Calls {@link ChannelHandlerContext#fireChannelReadSuspended()} to forward
     * to the next {@link ChannelHandler} in the {@link ChannelPipeline}.
     *
     * Sub-classes may override this method to change behavior.
     */
    @Override
    public void channelReadSuspended(ChannelHandlerContext ctx) throws Exception {
        ctx.fireChannelReadSuspended();
    }


    /**
     * Calls {@link ChannelHandlerContext#fireUserEventTriggered(Object)} to forward
     * to the next {@link ChannelHandler} in the {@link ChannelPipeline}.
     *
     * Sub-classes may override this method to change behavior.
     */
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt)
            throws Exception {
        ctx.fireUserEventTriggered(evt);
    }
}
它实现的方法都是直接调用当前handler的context的相应的方法,然而这些方法将会在pipeline上面从前到后寻找stathandler来处理。。。(state是从前到后,operation是从后到前、、)


至于ChannelHandlerAdapter就更简单了,直接实现空方法什么的,这里就不列出来了。。。


接下来我们来看ChannelInitializer的定义吧,它从写了channelRegistered以及inboundBufferUpdated两个方法,另外定义了一个抽象方法initChannel留给用户定义的类来实现,我们来看看channelRegistered方法的定义吧:


   public final void channelRegistered(ChannelHandlerContext ctx)
            throws Exception {
        boolean removed = false;
        boolean success = false;
        try {
        //调用用户定义的init函数对当前的channel进行初始化
            initChannel((C) ctx.channel());
            ctx.pipeline().remove(this);   //从当前的pipeline上面将当前的handler移除,因为没有什么用了
            removed = true;
            ctx.fireChannelRegistered();   //激活下面的一个stathandler的channelRegistered方法,(pipeline从前到后)
            success = true;
        } catch (Throwable t) {
            logger.warn("Failed to initialize a channel. Closing: " + ctx.channel(), t);
        } finally {
            if (!removed) {
                ctx.pipeline().remove(this);
            }
            if (!success) {
                ctx.close();
            }
        }
    }
这里代码比较简单,而且注释也说的很明白了,也就是调用在用户具体定义的initChannel函数来对当前的channel进行一些初始化的操作,并且会在当前的pipeline上面将当前这个ChannelInitializer移除。。。因为没有用了。。。


这里也就告诉了我们ChannelInitializer的用法,也就是要自己定义initChannel函数,当当前的channel被注册到eventloop上面之后,会用该用户定义的函数来初始化channel,一般都是一些加入handler的操作。。。






好了这里ChannelInitializer就分析的差不多了吧。。。接下来再分析别的handler吧。。。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Netty-socketio是一个用于构建实时通信应用程序的开源框架。它基于Netty框架,通过使用WebSocket协议来实现异步、高性能的网络通信。Netty-socketio具有以下特点: 1. 强大的异步处理能力:Netty-socketio采用事件驱动的方式处理客户端请求,能够高效地处理大量并发连接。 2. 完善的消息传递机制:Netty-socketio提供了灵活的消息传递方式,支持广播、点对点、房间等不同的消息发送方式,满足不同场景下的通信需求。 3. 多协议支持:Netty-socketio不仅支持WebSocket协议,还支持其他常用的协议,如TCP、HTTP等,便于与现有的系统集成。 4. 可扩展性强:Netty-socketio提供了丰富的拓展接口,用户可以根据自己的需求定制和扩展框架的功能。 5. 易于使用:Netty-socketio提供了简洁的API和丰富的文档,可以快速上手使用,并提供了相应的示例代码,方便开发者学习和理解。 对于客服应用来说,Netty-socketio作为一个实时通信框架,可以用于构建在线客服聊天系统。通过使用Netty-socketio,我们可以实现客户与客服人员之间的实时消息传递,支持文字、图片、文件等多种类型的消息。客户可以通过网页或移动端应用与客服人员进行沟通,实时解决问题,提升用户体验。 Netty-socketio提供了强大的异步处理能力和全双工通信机制,能够处理大量并发连接,并保持连接的稳定性和可靠性。同时,它的多协议支持和可扩展性强的特点,使得我们可以根据自己的业务需求进行定制和拓展,满足不同客服场景下的通信需求。 总之,Netty-socketio作为一个强大的实时通信框架,为客服应用提供了一种高效、稳定的解决方案,帮助企业构建更好的客服系统,并提升客户的满意度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值