netty 核心组件讲解

Posted 华清远见

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了netty 核心组件讲解相关的知识,希望对你有一定的参考价值。


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进行学习了解!

【近期文章推荐】

1.

2.

3.

4. 

5.

6.

回复“0-71”任一数字,即可查看往期文章精选哦


点住二维码3

与10万程序高手做朋友

每天干货喂饱你

 

免费讲座 | 干货分享 | 程序员生活 | 就业招聘

高端IT就业培训专家

m.embedu.org

以上是关于netty 核心组件讲解的主要内容,如果未能解决你的问题,请参考以下文章

深入剖析 Netty 的核心组件

Netty-核心模块组件-4

Day472.Netty 核心模块组件 -netty

Netty学习笔记:Netty核心模块组件

「Netty实战 03」大白话 Netty 核心组件分析

Day472&473&474.Netty 核心模块组件 -netty