Java Netty:核心模块(二)

Java异步框架之Netty详解 Netty是一个基于Java的异步事件驱动网络应用框架,以高性能、高可扩展性著称。它采用异步非阻塞I/O处理,通过事件驱动模型实现高效的并发连接处理。Netty提供丰富的功能和工具集,包括支持多种协议、模块化设计、易用API、内置编解码器、健壮性、错误处理机制等。其工作原理围绕Reactor(EventLoop)、Handler、NIO和Channel等核心组件展开。Netty广泛应用于企业级应用、分布式系统、实时数据处理、游戏服务器、RPC框架及自定义协议实现等场景。 阅读详情

Netty 核心模块:Bootstrap、ServerBootstrap、Future、ChannelFuture、Channel、ChannelHandler、Pipeline、ChannelPipeline、ChannelHandlerContext、ChannelOption、EventLoopGroup、NioEventLoopGroup、Unpooled

Bootstrap、ServerBootstrap

  • 主要作用就是配置整个 Netty 程序,串联各个组件
  • Bootstrap 是客户端程序的启动类
  • ServerBootstrap 是服务端启动引导类
  • 常用方法
    • group(bossGroup, workerGroup):用于服务端,设置两个 EventLoop,客户端设置 EventLoopGroup
    • channel:设置服务端的通道实现
    • option:给 ServerChannel 添加配置
    • childOption:接收到到通道添加配置
    • childHandler:设置业务处理类,自定义 handler
    • bind:绑定端口号
    • connect:用于客户端连接服务器

Future、ChannelFuture

  • Netty 中所有的 IO 操作都是异步的,不能立刻得知消息是否被正确处理,可以通过 Future 和 ChannelFuture 注册监听
  • 常用方法
    • channel:返回正在进行 IO 操作的通道
    • sync:等待异步操作执行完毕

Channel

  • Netty 网络通信的组件,执行网络 IO 操作
  • 通过 Channel 可以获取当前网络连接通道的状态
  • 通过 Channel 可以获得网络连接的配置参数
  • Channel 提供异步的网络 IO 操作(连接、读写、绑定端口),异步任何 IO 调用都将立即返回,但是不保证操作完成
  • 会立即返回一个 ChannelFuture 实例,可以监听 IO 操作
  • 支持关联 IO 操作与对应的处理程序
  • 不同协议、不同阻塞类型都有不同的 Channel 类型
    • NioSocketChannel:异步客户端 TCP Socket 连接
    • NioServerSocketChannel:异步服务端 TCO Socket 连接
    • NioDatagramChannel:异步 UDP 连接
    • NioSctpChannel: 异步客户端 Sctp 连接
    • NioSctpServerChannel:异步服务端 Sctp 连接

Selector

  • Netty 基于 Selector 对象实现 IO 多路复用,一个线程可以监听多个连接 Channel 事件
  • 向一个 Selector 注册 Channel 后,就可以不断查询是否有就绪的 IO 事件,可以简单高效的管理多个 Channel
    ChannelHandler
  • 是一个接口,处理 IO 事件或者拦截 IO 操作,并转发到 ChannelPipeline 中的下一个处理程序
  • 并没有很多方法,可以继承子类使用

Pipeline、ChannelPipeline

  • ChannelPipeline 是一个 Handler 的集合,负责处理和拦截 inbound 或者 outbound 的事件和操作,相当于贯穿 Netty 的链
  • ChannelPipeline 实现了一种高级形式的拦截过滤器模式,使用户可以完全控制事件的处理方式,以及 Channel 中各个的 ChannelHandler 如何相互交互
  • 每个 Channel 有且只有一个 ChannelPipeline 与之对应
    • ChannelPipeline 中又维护了一个由 ChannelHandlerContext 组成的双向链表,并且每个 ChannelHandlerContext 中又关联着一个 ChannelHandler
    • 入站事件和出战事件在一个双向链表中,入站事件会从链表 head 往后传递到最后一个入站的 handler,出站事件会从链表 tail 往前传递到最新一个出站的 handler,两种类型的 handler 互不干扰
  • 常用方法
    • addFirst:把 handler 添加到链中第一个位置
    • addLast:把 handler 添加到链中最后一个位置

ChannelHandlerContext

  • 保存 Channel 所有上下文信息,同时关联一个 ChannelHandler 对象,包含一个具体到事件处理器 ChannelHandler
  • 绑定对应到 pipeline 和 Channel 信息,方便 ChannelHandler 调用
  • 常用方法
    • close:关闭通道
    • flush:刷新
    • writeAndFlush:将数据写到 ChannelPipeline 中当前 ChannelHandler 的下一个 ChannelHandler 开始处理

ChannelOption

  • Netty 创建 Channel 实例后,一般需要设置 Option 参数
  • 参数
    • SO_BACKLOG:backlog 参数,初始化服务器可连接队列大小
    • SO_KEEPALIVE:保持连接活动状态
      EventLoopGroup、NioEventLoopGroup
  • EventLoopGroup 是一组 EventLoop 的抽象,更好利用 CPU 资源一般会有多个 EventLoop 同时工作,每个 EventLoop 维护着一个 Selector 实例
  • EventLoopGroup 提供 next 接口,可以按照规则取其中一个 EventLoop 处理任务,服务器端一般需要提供两个(Boss、Worker)
    • BossEventLoopGroup 通常是一个单线程的 EventLoop,维护着一个注册了 ServerSocketChannel 的 Selector 实例,不断轮询将连接事件分离出来
    • 通常是 OP_ACCEPT 事件,将接收到的 SocketChannel 交给 WorkerEventLoopGroup,由 next 选择其中一个 EventLoopGroup 来注册并处理后续事件
  • 通常一个服务端口即一个 ServerSocketChannel 对应一个 Selector 和一个 EventLoop 线程
  • 常用方法
    • NioEventLoopGroup:构造方法
    • shutdownGracefully:断开连接

Unpooled

  • Netty 提供的一个专门用来操作缓冲区的工具类
  • 常用方法
    • copiedBuffer:给定的数据和字符编码返回一个 ByteBuf 对象(类似 ByteBuffer)

编码解码

  • 基本介绍
    • 数据在网络中传输的都是二进制字节码数据,发送时就需要编码,接收时就需要解码
    • codec(编解码器)组成分两个:decoder(解码器)和 encoder(编码器)
  • 存在问题
    • 无法跨语言、序列化后体积太大(二进制编码 5 倍多)、序列化性能太低
  • Protobuf(Google Protocol Buffers)
    • 基本介绍
      • 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化或序列化
      • 适合做数据存储或 RPC 数据交换格式
      • Protobuf 是以 message 的方式来管理数据的,支持跨平台、跨语言、高性能、高可靠性
      • protobuf 能自动生成代码

入站出站

  • 基本说明
    • Netty 主要组件:Channel、EventLoop、ChannelFuture、ChannelHandler、ChannelPipe 等
    • ChannelHandler 充当处理入站和出站数据的容器
    • ChannelPipeline 提供了 ChannelHandler 链的容器
      • 客户端到服务端的方向是出站,反之入站
  • 编码解码器
    • 入站消息会被解码,出站消息会被编码
    • 结论
      • 不论解码器 handler 还是编码器 handler,接收的消息类型必须和处理的类型一致,否则不会执行
      • 解码器解码时,需要判断缓存区数据是否足够,否则收到的结果可能不一致
    • ReplayingDecoder 解码器
      • 继承 ByteTOMessageDecoder,扩展类这个类,不必调用 readableBytes() 方法
      • 局限性
        • 不是所有的 ByteBuf 都支持
        • 格式复杂等情况下还会比 ByteToMessageDecoder 慢,消息会被拆分成多个碎片,速度变慢
    • 其他解码器
      • LineBaseFrameDecoder:使用行尾控制字符作为分隔符来解析数据
      • DelimiterBasedFrameDecoder:自定义特殊符号作为消息分隔符
      • HttpObjectDecoder:HTTP 数据解码器
      • LengthFieldBasedFrameDecoder:指定长度来标示整包信息,自定处理粘包和半包消息
      • …
Java NIO与Netty网络编程 Java NIO和Netty都是网络编程中的重要技术。Java NIO提供了非阻塞I/O操作的能力,使得开发高性能网络应用成为可能;而Netty则是一个基于Java NIO的高性能网络应用框架,它封装了Java NIO的复杂性,提供了更易于使用的API和丰富的功能。在实际应用中,应根据具体需求和项目特点选择合适的技术,并结合最佳实践进行优化和实现。 阅读详情

相关推荐

【Netty系列10】Netty源码探秘:核心机制解析

本文深入解析Netty框架的两大核心机制:EventLoop运行流程和ByteBuf池化分配。EventLoop采用单线程串行处理模式,通过任务队列、IO事件监听和任务执行的循环实现高效事件处理。ByteBuf池化分配通过分级内存块、引用计数和本地线程缓存实现零拷贝和内存复用,显著提升性能。文章结合源码剖析设计思想,揭示Netty如何通过事件循环调度与内存池化实现高并发与低GC开销的平衡,为构建高性能网络应用提供经典范本。

穷冬不见雪,正月已闻雷的博客 904

【netty】主动关闭netty server

设计一个可以控制监听端口的http服务端的开启和关闭的功能,启动部分比较简单,关闭查了一下,找到了功能,以下是demo import com.wangjx.swallow.common.server.IServer; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.Channe.

非正常人研究室 2673

bootstrap开启与关闭tomcat

通过控制bootstrap接口实现对tomcat启动与关闭

Netty源码系列(2)——ServerBootstrap

先上一段经典使用姿势的样例代码。 EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootst

混混的博客 519

RK3566/RK3588 NPU性能实测:用mobilenet模型快速验证你的开发板NPU是否正常工作

本文提供了RK3566/RK3588开发板NPU性能实测指南,通过MobileNet模型快速验证NPU是否正常工作。详细介绍了环境搭建、测试资源获取、编译运行及结果分析的全流程,帮助开发者高效验证神经网络加速器功能,为后续AI应用部署奠定基础。

weixin_28826521的博客 447

Virbox Protector:全方位守护 Android 应用安全

在数字化浪潮中,Android 应用面临着诸多安全挑战,如破解、篡改、盗版、数据窃取和钓鱼欺诈等。为了应对这些复杂的安全问题,Virbox Protector 应运而生,为 Android 应用提供高强度的专业化安全保护,支持对 APK 和 AAB 文件的加固保护,并兼容 Google Play,助力应用顺利出海。

VBP_2025的博客 996

Netty中ServerBootstrap类介绍

Netty中的核心类之一:ServerBootstrap类。

小飞侠的博客 3078

Mininet 2.2.1 图形可视化界面使用注意事项

前言 关于mininet的安装,网上教程不少,大致可以参考以下这篇文章: https://blog.youkuaiyun.com/linyixiao88/article/details/65651390 安装的时候,也可以不必根据上面这篇文章这么麻烦,直接sudo apt-get install mininet,即可。 Mininet可视化 Mininet 2.2.0以上版本内置了...

裕东方的博客 4190

学习 java netty (二) -- ServerBootstrap

前言:我们自己使用java nio开发网络程序是非常繁琐的,netty为我们做好了一切,其中ServerBootstrap是一个启动辅助类,了解它我们就能开发出简单的nio 服务端程序。 不理解Nio中channel和handler等可参考上一篇文章 学习 java netty (一) – java nio ServerBootstrap()://创建一个ServerBootstrap对象

IT小小鸟~~ 5368

Cadence Allegro PCB文件对比实战:3分钟搞定两份设计差异(附颜色标注技巧)

本文详细介绍了如何高效使用Cadence Allegro的Design Compare功能进行PCB文件差异对比。通过实战工作流,可在3分钟内精准定位并理解两份设计在布局、布线、元件等方面的关键差异,并分享了自定义颜色标注技巧,帮助工程师快速聚焦重要修改,提升设计评审与团队协作效率。

weixin_29248653的博客 378

【原创教程】西门子1500与施耐德伺服的通讯以及调试

该函数块主要描述伺服的手动,左边的引脚Forward是指伺服手动正转,Backward是指伺服手动反转,Fast是指手动的某个方向为快速运行,TipPos手册上描述为固定值,WaitTIme是指伺服手动的相应时间,VeloSlow指伺服手动正常慢速运动的速度,VeloFast指伺服手动快速运动的速度,Acceleration是指伺服手动的加速度,Decelertion是指伺服手动的减速度。该函数块用于伺服停止,左边的引脚Execute为伺服停止执行,Deceleration含义为减速,Axis为轴。

Qinmingyue13的博客 1374

Netty---BootStrap

Bootstrap类是Netty提供的一个工厂类,作用:Netty组件的组装,Netty程序的初始化。 一,概念 1.父子通道 在Netty中,每一个NioSocketChannel通道所封装的是Java Nio通道,java Nio下面就是操作系统封装的socket描述符。操作系统的底层socket描述符又分为: 1.连接监听类型:放在服务器端,负责接收客户端的套接字连接请求,一个监听类型的socket描述符可以监听成千上万个连接请求。 2...

阿七 1685

安路TangDynasty和FD和JTAG驱动器安装

安路FPGA产品矩阵包含SALPHOENIX高性能、SALEAGLE高性价比和SALELF低功耗三大系列,广泛应用于网络通信、消费电子等领域。配套的TangDynasty(TD)集成开发环境支持标准设计输入,提供完整优化流程与调试工具。简要介绍了TD 6.2.1版本的安装步骤。

wangjie36的博客 1030

Netty 核心源码解析

Netty 第一讲:Netty 架构与原理本文是《Netty 三讲》的第二讲:Netty 核心源码解析(部分),大纲如下:前言1. Netty 服务端启动过程源码剖析1.1. 执行 ne...

weixin_41385912的博客 1万+

AI上推荐 之 协同过滤

㐇

Miracle8070 1万+

微信文件自动归档!手把手教你用OpenClaw搭个自己的“数字员工”,告别重复劳动

很多人说“AI是未来”,但未来不是靠喊口号的。OpenClaw的真正价值,是让你把重复劳动交出去,把时间留给真正需要创造力的事。这事真能干,而且不难。下载OpenClaw(GitHub仓库按我写的步骤跑一遍遇到坑,评论区留言——我亲自帮你看作者后记:上周五,我让AI自动归档了文件后,终于在5点准时下班。回家路上,我给它发了条消息:“干得漂亮”。它没回,但我知道——它在默默等我的下一条指令。

2601_94871597的博客 412

Netty网络框架详解:Java实现与核心原理

Netty作为一个高性能的网络应用框架,通过其丰富的组件和灵活的设计,为开发者提供了强大的网络编程能力。本文通过Java代码示例展示了Netty服务器和客户端的基本实现,并分析了其优缺点和适用场景。对于需要处理大量并发连接或实现复杂协议的应用来说,Netty无疑是一个值得考虑的选择。

yukinoo_0的博客 1575

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Netty学习二:Netty整体框架

Netty学习系列

weixin_41402069的博客 3159

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Netty】NIO与Netty核心概念

Netty核心概念

qq_43745578的博客 1278

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Netty学习(二):Netty的核心组件

学习Netty有一个很大的苦难点就是关于Netty有一大堆的专有名词,如果不懂这些专有名词的意思,就很难读懂源码和理解Netty的流程。 一、Netty的核心组件 一.Channel(通道) Channel 是 Java NIO 的一个基本构造。 它代表一个到实体( 如一个硬件设备、一个文件、一个网络套接字或者一个能够执 行一个或者多个不同的I/O操作的程序组件) 的开放连接,如读操作和写操作 目前,可以把 Channel 看作是传入(入站)或者传出(出站)数据的载体。因此,它可以 被打开或者被关闭,连接或

好好学习天天向上 1059

Netty学习专栏(一):Java NIO编程与核心组件详解

本文探讨了在分布式系统和微服务架构中,高性能网络通信的重要性,并介绍了Netty作为Java领域最成熟的高性能网络框架的应用。文章强调,理解Java NIO(New I/O)的核心概念是掌握Netty的基础,因为Netty的线程模型和零拷贝等高级特性都建立在NIO模型之上。文章详细对比了BIO(Blocking I/O)和NIO(Non-blocking I/O)的核心差异,包括阻塞方式、编程模型、数据处理方式和代码结构。

qq_43947876的博客 1501

Java基础之《netty(16)—netty核心模块》

1、Bootstrap意思是引导,一个netty应用通常由一个Bootstrap开始,主要作用是配置整个netty程序,串联各个组件,netty中Bootstrap类是客户端程序的启动引导类,ServerBootstrap是服务端启动引导类。该方法用于服务器端,用来设置两个EventLoop。该方法用于客户端,用来设置一个EventLoop。该方法用来设置一个服务器端、客户端的通道实现。该方法用于服务器端,用来设置占用的端口号。该方法用于客户端,用来连接服务器。用来给接收到的通道添加配置。

csj50的专栏 616

【Netty4核心原理②】【Java I/O 演进之路】

本系列内容为阅读《Netty4 核心原理》一书内容总结,内容存在个人删改,仅做个人笔记使用。第二章 Java I/O演进之路</</</</TODO严格来说,前四种 IO 模型都是 同步 IO 操作,他们的区别在于第一阶段,而第二阶段是一样的,在数据从内核拷贝到应用缓冲区期间(用户空间),进程阻塞于recvfrom 调用。

猫吻鱼的博客 1068

【netty】----第 6 章 Netty 核心模块组件

本文介绍了Netty框架的核心组件及其功能。Bootstrap和ServerBootstrap分别是客户端和服务端的启动引导类,用于配置程序并串联组件。ChannelFuture处理异步I/O操作的结果通知,Channel负责网络通信及状态管理。Selector实现I/O多路复用,单线程监听多个Channel事件。ChannelHandler处理I/O事件,通过重写方法实现业务逻辑。ChannelPipeline作为Handler集合,管理入站和出站事件的处理流程。ChannelHandlerContext

朱朱博客,分享技术 992

【Netty4核心原理③】【 Netty 与 NIO 之前世今生】

本系列内容为阅读《Netty4 核心原理》一书内容总结,内容存在个人删改,仅做个人笔记使用。第三章 Netty 与 NIO 之前世今生</</</</TODO。

猫吻鱼的博客 1327

【Netty专题】Netty实战与核心组件详解

Netty啊,真的是大名鼎鼎!Netty之于Java网络编程,相当于Spring之于Java开发。两者都是Java生态的金字塔尖的【框架】!所以,非常推荐Java程序员学习这个框架。Netty有多牛逼?据说,曾经在性能上把谷歌公司一个用C++写的网络通信框架都给人干碎了。后来,后者参照了Netty的设计方案,才完成了超越。Netty是由 JBOSS 提供的一个Java开源网络通信框架。它是一个【异步事件驱动】的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。也就是说,

qq_32681589的博客 823
上一篇: Java Netty:基础入门(一)
下一篇: 小知识点:Docker 安装、命令、Dockerfile ...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值