Netty核心组件

Netty的核心组件

  Channel

  回调

  Future

  事件

  ChannelHandler

  这些模块代表了不同的类型:资源(事件)、逻辑(ChannelHandler中包含各种处理逻辑)、通知(回调、Channel、Future)。应用程序通过这几个模块之间的组合就可以实现数据的流通

Channel

  通道,是 java NIO 的一个基本构造。可以把它看作是传入(入站)或者传出(出站)数据的载体。也就是说数据的流通得经过它。每一个 Channel 都拥有一个与之相关联的 ChannelPipeLine,其持有一个 ChannelHandler 的实例链。

回调

  一种通知的方式。可以简单的理解为:张三找李四出去打球,但是这时李四有事,于是张三留了自己的电话号码(引用)给李四,告诉他做完了事情打电话通知我。不久之后,李四把手中的事情处理完毕了,于是打了电话给张三说道:我的事情处理完了,我们去打球吧!!!如上就是一个回调的过程。

Future

  提供了一种在操作完成时通知应用程序的机制。它相当于一种结果占位符(一个临时的结果,目的在于是程序不至于阻塞)。Java jdk提供了Future的实现,只是需要手动的检查操作是否已经完成了,或者一直阻塞知道完成为止,比较繁琐且效率低。所以Netty提供了ChannelFuture,用于执行异步操作的时候使用。

  ChannelFuture 提供了几个额外的方法,这些方法使得我们能够注册一个或者多个 ChannelFutureListener 实例。例如监听器的 回调方法:operationComplete(),将会在对应的操作完成时被调用(注意:如果在 ChannelFutureListener 添加到 ChannelFutre 的时候,ChannelFuture应完成了,那么该 ChannelFutureListener 将会被直接地通知到)。

....    
ChannelFuture cf = bs.connect(host, port).sync();
        //添加一个监听,当连接成功后,发送数据
        cf.addListener(new ChannelFutureListener() {
            
            @Override
            public void operationComplete(ChannelFuture future) throws Exception {
                if(future.isSuccess()){
                    ChannelFuture sendMsg = cf.channel().writeAndFlush("I am client");
                }else{
                    Throwable cause = future.cause();
                    cause.printStackTrace();
                }
            }
        });
...

  ChannelFutureListener 实际上是回调的一个更加精细的版本。事实上,回调和 Future 是相互补充的机制;他们相互结合,构成 Netty 本身的关键构建快之一

扫描二维码关注公众号,回复: 1057847 查看本文章

事件和ChannelHandler

        简单来说就是程序即将执行的某些行为:记录日志,数据转换,应用程序逻辑......。由于所有的事件的根本目的都是为了数据能够正常、高效地流通,根据数据流的方向不同,把时间分为入站事件和出站事件。入站事件一般包括:数据读取、用户事件、错误事件等等,出站事件一般包括:将数据写到或者冲刷到套接字,打开或者关闭远程节点的连接等等。

        事件又和对应的事件处理器(Netty 的 ChannelHandler 为处理器提供了基本的抽象)息息相关,如下图说明了他们之间的关系:

1-3


后续会对 ChannelHandler 做更多的说明,现在可以认为每一个 ChannelHandler 的实例都类似于一种为了响应特定事件而被执行的回调

总结

Future、回调和 ChannelHandler

        Netty 的异步编程模型是建立在 Future 和回调的概率之上的,而将事件派发到 ChannelHandler 的方法则发生在更深的层次上。使得应用程序逻辑可以独立于任何网络环境,达到高可复用性。

选择器、事件、EventLoop

        Netty 通过触发事件将 Selector 从引用程序中抽象出来,消除了所有本来需要手动编写的派发代码。同时,在内部,将会为每个 Channel 分配一个 EventLoop,用以处理所有事件,包括:

  •         注册感兴趣的事件
  •         将事件派发给 ChannelHandler

        EventLoop 本生只有一个线程驱动,其处理一个 Channel 中的所有 IO 事件,且在 EventLoop 整个生命周期都不会改变。这样的设计就可以消除开发者在 ChannelHandler 的实现中需要进行同步的任何顾虑(不会有任何同步问题)。

下一章:Netty 的 API 以及编程模型的基础知识,同时你将会拥有你的第一款由 Netty 搭建的客户端和服务器的引用程序



问题:

        EventLoop整个生命周期的范围?

  回调和 Future 是相互补充的机制?

 

 

 

    

 

猜你喜欢

转载自blog.csdn.net/yhs1296997148/article/details/80374007