当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > netty核心组件

netty核心组件 时间:2018-09-28      来源:未知

1、下面我们来看一下netty中是怎样处理数据的:

当一个链接建立时,我们需要知道怎么来接收或者发送数据,当然,我们有各种各样的Handler实现来处理它,那么就需要ChannelInitializer来配置这些Handler,它会提供一个ChannelPipeline,并把Handler加入到ChannelPipeline 中,说到Handler我们就不得不提ChannelPipeline,ChannelPipeline负责安排Handler的顺序及其执行,下面我们就来详细介绍一下他们:

  2、接着看一下ChannelPipeline and handler

     我们的应用程序中用到的多的应该就是ChannelHandler,netty 服务器各个组件的使用

我们可以这么想象,数据在一个ChannelPipeline中流动,而ChannelHandler便是其中的一个个的小阀门,这些数据都会经过每一个ChannelHandler并且被它处理。这里有一个公共接口ChannelHandler:

     ChannelHandler有两个子类ChannelInboundHandler和ChannelOutboundHandler,这两个类对应了两个数据流向,如果数据是从外部流入我们的应用程序,我们就看做是inbound,相反便是outbound。其实ChannelHandler和Servlet有些类似,一个ChannelHandler处理完接收到的数据会传给下一个Handler,或者什么不处理,直接传递给下一个。下面我们看一下ChannelPipeline是如何安排ChannelHandler的:

 一个ChannelPipeline可以把两种Handler(ChannelInboundHandler和ChannelOutboundHandler)混合在一起,当一个数据流进入ChannelPipeline时,它会从ChannelPipeline头部开始传给第一个ChannelInboundHandler,当第一个处理完后再传给下一个,一直传递到管道的尾部。与之相对应的是,当数据被写出时,它会从管道的尾部开始,先经过管道尾部的“后”一个ChannelOutboundHandler,当它处理完成后会传递给前一个ChannelOutboundHandler。

数据在各个Handler之间传递,这需要调用方法中传递的ChanneHandlerContext来操作, 在netty的API中提供了两个基类分ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapter,他们仅仅实现了调用ChanneHandlerContext来把消息传递给下一个Handler,因为我们只关心处理数据,因此我们的程序中可以继承这两个基类来帮助我们做这些,而我们仅需实现处理数据的部分即可。

     InboundHandler和OutboundHandler在ChannelPipeline中是混合在一起的,那么它们如何区分彼此呢?其实很容易,因为它们各自实现的是不同的接口,对于inbound event,Netty会自动跳过OutboundHandler,相反若是outbound event,ChannelInboundHandler会被忽略掉。

     当一个ChannelHandler被加入到ChannelPipeline中时,它便会获得一个ChannelHandlerContext的引用,而ChannelHandlerContext可以用来读写Netty中的数据流。因此,现在可以有两种方式来发送数据,一种是把数据直接写入Channel,一种是把数据写入ChannelHandlerContext,它们的区别是写入Channel的话,数据流会从Channel的头开始传递,而如果写入ChannelHandlerContext的话,数据流会流入管道中的下一个Handler。

3、关于netty业务逻辑处理

我们真正的业务逻辑便是处理接收到的数据。Netty提供了一个常用的基类SimpleChannelInboundHandler<T>,其中T就是这个Handler处理的数据的类型,消息到达这个Handler时,Netty会自动调用这个Handler中的channelRead0(ChannelHandlerContext,T)方法(在netty5.0中虫命名为messageReceived (ChannelHandlerContext, T),不过netty5.0已经弃用),T就是传递过来的数据对象,在这个方法中我们便可以任意写我们自己的业务实现逻辑了。

Netty是基于java NIO的一个异步非阻塞的事件驱动型的高性能、方便开发的NIO框架。满足高性能协议服务器和客户端的快速发展需求,用它可以简单快速地开发网络应用程序,比如客户端和服务端的协议。能够大大简化了网络编程,比如TCP和UDP的 Socket的开发。为我们提供了一个高开发效率、高性能、稳定、可扩展的解决方案。

在开始学习netty之前,希望大家先对java NIO进行学习了解!

上一篇:Linux字符设备驱动模型之操作函数集

下一篇:《愤怒的小鸟》中的2D物理系统实现

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部