当前位置: 首页 > article >正文

Netty 常见组件介绍

Netty 常见组件介绍

上篇文章Netty入门程序echo 基本包含了Netty常见的组件,本文分别介绍各个组件

  • Bootstrap or ServerBootstrap
  • EventLoop
  • EventLoopGroup
  • ChannelPipeline
  • Channel
  • Future or ChannelFuture
  • ChannelInitializer
  • ChannelHandler

Bootstrap vs ServerBootstrap

Bootstrap

Bootstrap 主要用于客户端的配置,它主要用于创建一个连接到远程服务器的客户端应用程序

它允许你设置以下内容

  • EventLoopGroup
  • Channel
  • ChannelInitializer 用来配置新创建的通道的 ChannelPipeline。
 Bootstrap b = new Bootstrap();
            b.group(group)
             .channel(NioSocketChannel.class)
             .handler(new ChannelInitializer<SocketChannel>() {
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {
                     ch.pipeline().addLast("decoder", new StringDecoder());
                     ch.pipeline().addLast("encoder", new StringEncoder());
                     ch.pipeline().addLast(new ClientHandler());
                 }
             });

            // 连接到服务器
            ChannelFuture f = b.connect(host, port).sync();

ServerBootstrap

ServerBootstrap 是专门用于配置和启动服务端通道的工具类。
它用于创建一个能够监听指定端口,接收客户端连接并处理客户端请求的服务器应用程序

ServerBootstrap还需要配置
childHandler 服务端会为每个客户端连接创建一个新的通道,childHandler方法用于添加处理这些客户端通道事件的ChannelHandler。

ServerBootstrap 需要两个 EventLoopGroup,一个用于接受连接
另一个用于处理 IO读写操作,而Bootstrap只需要指定一个EventLoopGroup用于处理IO读写操作

 EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .childHandler(new ChannelInitializer<SocketChannel>() {
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {
                     ch.pipeline().addLast("decoder", new StringDecoder());
                     ch.pipeline().addLast("encoder", new StringEncoder());
                     ch.pipeline().addLast(new ServerHandler());
                 }
             });

            ChannelFuture f = b.bind(port).sync();

Channel

Channel 在 Netty 中是对网络 I/O 操作的抽象。它代表了一个网络连接或者通信管道,可以是服务器端用于监听客户端连接的通道,也可以是客户端用于连接服务器的通道。

  • NioSocketChannel

基于 Java NIO 的 Socket 通道,主要用于客户端建立 TCP 连接。前面Bootstrap客户端代码片段使用的就是NioSocketChannel

  • NioServerSocketChannel

同样基于 Java NIO,用于服务器端监听 TCP 端口,等待客户端的连接请求。前面ServerBootstrap代码片段使用的就是NioSocketChannel

  • EpollSocketChannel 和 EpollServerSocketChannel(适用于 Linux)

这两种通道是基于 Linux 的 epoll 机制实现的。
EpollSocketChannel用于客户端连接,EpollServerSocketChannel用于服务器监听

  • OioSocketChannel 和 OioServerSocketChannel(基于旧的阻塞 I/O)

这是基于传统的阻塞式 I/O 实现的通道,使用的比较少,通常我们使用NIO,都使用Netty,还用阻塞IO,小编实在编不出有什么合适的理由。

ChannelPipeline

ChannelPipeline 是 Netty 中的一个核心组件,它是一个ChannelHandler 的责任链,负责处理所有的入站事件(读)和出站事件(写)。 无论服务端还是客户端都可能要处理读写事件,因为本质建立在TCP链接基础上,是全双工的。

ChannelPipeline无论在服务端还是客户端,它的设置都非常重要。

ChannelPipeline 包含着一系列的 ChannelHandler,服务端/客户端按照ChannelHandler顺序来处理 IO 事件,它的顺序非常重要。

事件处理顺序

责任链中隐含两个Handler,一个Header,一个是Tail,这两个非常重要,本文先点到为止。

加上Header和Tail用户向ChannelPipeline中添加的ChannelHandler1,ChannelHandler2,…,ChannelHandlerN ; 按顺序处理出站/入站事件。

入站事件顺序

入站事件从 ChannelPipeline 的头部开始,向尾部传播

Header -> ChannelHandler1 -> ChannelHandler2 -> … -> ChannelHandlerN -> Tail

出站事件顺序

出站事件则从ChannelPipeline尾部开始,向头部传播。

Tail -> ChannelHandlerN -> … -> ChannelHandler2 -> ChannelHandler1 -> Header

只有理解了ChannelPipeline的处理顺序,我们才能正确的设置责任链上 ChannelHandler,才能正确的处理对应事件。

ChannelInitializer

ChannelInitializer 是 Netty 中一个非常重要的组件, 它就像是一个 ChannelPipeline 的构建器

ChannelFuture

jdk线程池异步执行需要返回结果的 通常返回的是Future,
ChannelFuture 接口继承 Future,
ChannelFuture 是 Netty 中用于表示一个异步操作结果的接口。在 Netty 中,许多 I/O 操作(如连接建立、数据写入、绑定端口等)都是异步执行的。

ChannelHandler

ChannelHandler 是 Netty 中用于处理 Channel 事件的核心组件。它是一个接口,定义了一系列方法来处理各种网络 I/O 事件,
如数据读取、写入、连接建立和关闭等。可以把 ChannelHandler 看作是一个事件处理器

  • ChannelInboundHandler:
    处理入站事件,如连接建立、数据接收、异常捕获等。
    常见实现:SimpleChannelInboundHandler, ChannelInboundHandlerAdapter

  • ChannelOutboundHandler:
    处理出站事件,如绑定、连接、写入数据等。
    常见实现:ChannelOutboundHandlerAdapter

  • ChannelDuplexHandler:
    同时处理入站和出站事件。
    常见实现:ChannelDuplexHandler

上面列的几个类比较底层,Netty 内置了许多ChannelHandler ,如果使用Netty开发某些功能肯定会打交道,我们只需要专学处理消息的读写即可。以下列举几个典型的后续大部分都会接触。

  • ByteToMessageDecoder

它是一个抽象类,它实现了 ChannelInboundHandler 接口,底层将数据读到ByteBuf中,我们需要将ByteBuf 转换为业务对象,再传递给后续处理器处理。

与之相对应的是MessageToByteEncoder ,将业务消息对象编码为"ByteBuf",再发送给客户端(出站事件)

StringDecoder 和 StringEncoder 就是对应的实现类。 我们基于ByteToMessageDecoder也能实现内置的处理器的能力

public class MyByteToMessageDecoder extends ByteToMessageDecoder {
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
  
         msg = doDecode(in);
         out.add(msg);
         
    }
    
    
}

其他高级的内置处理器,我们在处理半包,粘包问题可以结合使用。

  • DelimiterBasedFrameDecoder

基于分隔符的解码器,用于处理以特定字符或字符序列分隔的消息。适用于消息以特定字符分隔的场景。 能够处理TCP 半包问题

  • LineBasedFrameDecoder

基于行的解码器,用于处理以换行符分隔的消息。适用于消息以换行符分隔的场景。可以看成是特殊的基于分隔符的解码器

  • FixedLengthFrameDecoder
    固定长度的帧解码器,用于处理固定长度的消息。适用于消息长度固定的场景。能够处理TCP 半包问题

总结

Netty 组件看上去很多,实际上我们通常只需要关注 消息解码、编码 和读写事件的处理,这也是选择Netty 原因,简单同时兼顾性能。


http://www.kler.cn/a/379243.html

相关文章:

  • 模型 海勒姆法则(用户依赖你未承诺的API功能)
  • 学webpack之loader原理,让面试官跪下来唱征服
  • pip install -r requirements.txt下载速度慢
  • 语言模型的采样方法
  • 【1】Excel快速入门的核心概念
  • C++基于opencv的视频质量检测--图像清晰度检测
  • 鸿蒙生态认识
  • Marvelous Designer导出纹理没有合并
  • leetcode-有效的字母异位词
  • PHP如何规避从URL的语义进行攻击
  • CSP 2024 入门级第二轮 CSP-J 2024 复赛 第二题 地图探险
  • 李彦宏《应用来了》主题演讲海报官宣,百度世界或带来多个新发布
  • 网络编程及回显服务器
  • flutter 专题四 Flutter渲染流程
  • [云] 大数据分析栈(Big Data Analytics Stack)+ Apache Hadoop分布式文件系统(HDFS)+Apache Spark
  • CSS综合练习(学校官网静态网页)
  • java HashMap
  • Go-单元测试
  • 前端Election
  • 如何用Python同时抓取多个网页:深入ThreadPoolExecutor
  • Django ORM详解:外键使用(外键逻辑关联)与查询优化
  • excel指定单元格输入相同的值,比如给D1~D10000输入现在的值
  • 硅谷甄选(七)属性管理模块
  • Oracle视频基础1.4.3练习
  • RHCA IV之路---EX316-9
  • 019集——获取CAD图中多个实体的包围盒(CAD—C#二次开发入门)