Netty是什么?

  Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。“快速”和“简单”并不用产生维护性或性能上的问题。Netty 是一个吸收了多种协议(包括FTP、SMTP、HTTP等各种二进制文本协议)的实现经验,并经过相当精心设计的项目。最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。

  Netty可以代替之前使用Socket编程实现的网络编程,不仅简化了编程开发流程,而且是基于异步的,事件驱动模式。所有使用网络通信的程序都可以使用Netty来进行实现。

Netty的核心组件

  • ByteBuf
  • Channel
  • ChannelPipeline
  • ChannelHandler
  • EventLoop
  • EventLoopGroup
  • Bootstrap和ServerBootstrap

ByteBuf

  网络数据的载体,数据全都包装在ByteBuf中进行传输。网络数据的基本单位是字节。

Channel

  Java Nio中Channel的作用相当于Java IO中的Stream,网络IO操作是在Channel上进行的。Netty中的Channel是对Java Nio中Channel的进一步包装,不仅仅提供了基本的IO操作,如bind,connect,read,write之外,还提供了Netty框架的一些功能,如获取channel的pipeline,eventloop等。

  Java Nio中的SocketChannel和ServerSocketChannel没有统一的视图,使用不方便,而Netty通过包装Java Nio中的Channel提供了统一的视图,并且在不同的子类中实现不同的功能,公共功能在父类中进行实现,最大程度实现了接口的重用。并且将Netty相关的功能类聚合在channel中,由channel进行统一调度和分配,功能实现更加灵活。

ChannelHandler

  ChannelHandler 为 Netty 中最核心的组件,它充当了所有处理入站和出站数据的应用程序逻辑的容器。ChannelHandler 主要用来处理各种事件,这里的事件很广泛,比如可以是连接、数据接收、异常、数据转换等。

  ChannelHandler 有两个核心子类 ChannelInboundHandler 和 ChannelOutboundHandler,其中 ChannelInboundHandler 用于接收、处理入站数据和事件,而 ChannelOutboundHandler 则相反。

  ChannelInitializer也是一个ChannelHandler,当ChannelInitializer被注册到ServerBootstrap后,当 ChannelInitializer.initChannel() 方法被调用时,ChannelInitializer 将在 ChannelPipeline 中安装一组自定义的 ChannelHandler,当安装完成之后,最后ChannelInitializer会从ChannelPipeline中移除。

ChannelPipeline

  ChannelPipeline其实就是对Channel进行处理的流水线,是ChannelHandler的容器,承载了很多ChannelHandler。从入站到出站,数据流经ChannelPipe,依次由ChannelHandler进行处理。

EventLoop

  Netty是事件驱动模型,使用不同的时间来通知我们状态的改变或者是操作状态的改变,EventLoop定义了在生命周期中有事件发生,用来处理连接的一个核心抽象。在内部,会为每一个channel分配一个EventLoop。

  EventLoop本身只由一个线程驱动,其处理了一个Channel的所有I/O事件,并且在该EventLoop的整个生命周期内都不会改变。这个简单而强大的设计消除了你可能有的在ChannelHandler实现中需要进行同步的任何顾虑。 

  Netty应用程序尽可能的重用EventLoop,以减少创建线程带来的开销。

EventLoop和EventLoopGroup的特性:

1、一个 EventLoopGroup 包含一个或者多个 EventLoop;
2、一个 EventLoop 在它的生命周期内只和一个 Thread 绑定;
3、所有由 EventLoop 处理的 I/O 事件都将在它专有的Thread 上被处理;
4、一个 Channel 在它的生命周期内只注册于一个EventLoop;
5、NIO中,一个 EventLoop 分配给多个 Channel(面对多个Channel,一个 EventLoop 按照事件触发,顺序执行); OIO中,一个 EventLoop 分配给一个 Channel。

Bootstrap和ServerBootstrap

  Bootstrap和ServerBootstrap是引导类,一个用于客户端,一个用于服务端,它主要对应用程序进行配置,并使其运行起来的过程。Netty处理引导的方式是使你的应用程序和网络层相隔离。

   BootStrap 是客户端的引导类,Bootstrap 在调用 bind()(连接UDP)和 connect()(连接TCP)方法时,会新创建一个 Channel,仅创建一个单独的、没有父 Channel 的 Channel 来实现所有的网络交换。(为啥要创建两个channel,这里不是很懂)

ServerBootstrap 是服务端的引导类,ServerBootstarp 在调用 bind() 方法时会创建一个 ServerChannel 来接受来自客户端的连接,并且该 ServerChannel 管理了多个子 Channel 用于同客户端之间的通信。

Netty的核心组件相关推荐

  1. Netty 的核心组件

    Netty 的核心组件有哪些? 1. Bootstrap 与 ServerBootstrap Bootstrap 与 ServerBootstrap 是 Netty 程序的引导类,主要用于配置各种参数 ...

  2. Netty学习1——Netty的核心组件

    Netty的核心组件 Netty的主要构件块:Channel.回调.Future.事件和ChannelHandler 1.Channel Channel是Java NIO的一个基本构造. 它代表一个到 ...

  3. Netty核心组件总览

    本文来说下Netty 核心组件 文章目录 核心组件概述 Bytebuf字节容器 Bootstrap和ServerBootstrap(启动引导类) Channel(网络操作抽象类) EventLoop( ...

  4. Netty是个啥?简单来说就这!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 本文来源:http://8rr.co/uBVt Netty是什么 ...

  5. Netty的实现原理、特点与优势、以及适用场景

    高并发编程系列 高并发编程系列:NIO.BIO.AIO的区别,及NIO的应用和框架选型 高并发编程系列:ConcurrentHashMap的实现原理(JDK1.7和JDK1.8) 高并发编程系列:Co ...

  6. Netty实战一之异步和事件驱动

    Netty是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端. 使用Netty你可以并不是很需要网络编程.多线程处理.并发等专业Java知识的积蓄. Net ...

  7. Netty的概念和架构

    关注微信公众号(瓠悠笑软件部落),大家一起学习,一起摸鱼. Netty 是一个嘿洋格的高性能网络程序框架.让我给你好好摆哈儿他最拽的三个地方: 只有网络专家才可以用netty编程?你跟老子爬!要是那样 ...

  8. Netty学习二:Netty整体框架

    一.Netty的整体结构和源码结构 1. Core层 提供底层网络通信的通用抽象和实现,包括可扩展的事件模型.通用的通信API和支持零拷贝的ByteBuf等. common模块是Netty的核心基础包 ...

  9. Netty学习(一):初识Netty

    章节 1.Netty学习(一):初识Netty 2.Netty学习(二):Netty的核心组件 3.Netty学习(三):Netty的流程分析 4.Netty学习(四):Netty零拷贝(转载) 5. ...

最新文章

  1. android 中文件操作模式
  2. 淘淘商城之技术选型、开发工具和环境、人员配置
  3. 流浪地球开机动画包zip_影视日报|合家欢动画电影quot;许愿神龙quot;定档1.15;流浪地球加长版定档11.26...
  4. #1130 - Host 'localhost' is not allowed to connect to this MySQL server
  5. c语言 异或_编程入门:C语言基础知识全网超全不用到处找了!(文末附清单)
  6. 一文带你了解人工智能最新进展:AI从业者如何选择技术路线?
  7. Delphi ArcEngine 创建比例尺
  8. linux下vlc视频录制,使用VLC录制屏幕
  9. 关于ADO.NET的困惑
  10. python交互式编程在哪里_终于明了python交互式编程入门
  11. 小议使用“完整”的CSS的缺点
  12. hdoj2084:数塔(dp基础题----递归写法/状态转移方程法)
  13. 网站开发执行文档(页面界面和功能说明文档)编写方法
  14. 计算机窗口保护颜色,如何设置电脑保护色,教你设置电脑保护色
  15. Ollydbg之字符串、WindowsAPI搜索
  16. 力扣:647. 回文子串
  17. 最新MDK软件安装包和芯片包及超详细图文教程来咯!!!
  18. 智和信通搭建高可靠、真稳定IT运维平台,助力能源行业高效生产
  19. 中景园LCD显示主函数
  20. mac风扇一直响_您如何找出哪个计算机风扇被响了?

热门文章

  1. 不支持模块化规范的插件可以使用import 导入的原因
  2. lodash 源码解读 _.findIndex(obj_array, fn)
  3. Chapter 3 Phenomenon——6
  4. RequestDispatcher对象的应用-请求包含
  5. mysql ip v4 v6_mysql IPv4 IPv6
  6. mysql 日志抓取变化_MySQL慢查询日志分析提取【转】
  7. 引用管理器没有程序集_Excel结构化表与名称管理器
  8. 外星人做系统logo_深圳福田外星人笔记本电脑维修服网点
  9. 绘制自己组合的k线图_短线投资者必备的四种双K线组合抄底技巧,次次选中黑马股,精准率超高...
  10. struct interface_GCTT | 接受 interface 参数,返回 struct 在 go 中意味着什么