Netty概述

Netty源码_01_Netty服务端初始化 文章目录一、前言二、demo:服务端启动2.1 demo2.1 demo中的每一行代码三、Netty源码解析:服务端初始化3.1 bind()方法:initAndRegister() + doBind0()3.2 初始化和注册:initAndRegister()3.2.1 initAndRegister()方法:newChannel() + init(channel)3.3.2 initAndRegister()第一步:newChannel()工厂模式新建一个channel3.3.2.1 新建一个Refle 阅读详情

Netty始终要写一篇来作为终结的,但是到了写的时候才发现无从下手,了解 的还是不够吧。无奈,从四处摘录了一大片东西,很多都是官网下来的,没有什么文字说明,权当参考了。

首先来一张总体架构图,这个是从Neety官网上摘下来的,描述了Netty的核心架构和总体功能。
 

1.  BootStrap

 

Bootstrap : ChannelFactory, ChannelPipeline, ChannelPipelineFactory

初始化channel的辅助类

为具体的子类提供公共数据结构

ServerBootstrap: bind()

创建服务器端channel的辅助类

接收connection请求

ClientBootstrap: connect()

创建客户端channel的辅助类

发起connection请求

ConnectionlessBootstrap: connect() , bind()

创建无连接传输channel的辅助类(UDP)

包括Client 和Server

2.  Buffer

Buffer的作用在于取代nio中的java.nio.ByteBuffer,相比ByteBuffer,可以根据需要自定义buffertype。内置混合的buffertype, 以实现zero-copy。提供类似StringBuffer的动态dynamic buffer;不需要调用flip方法;推荐使用ChannelBuffers的静态工厂创建ChannelBuffer.

3.  channel

org.jboss.netty.channel

channel核心api,包括异步和事件驱动等各种传送接口

org.jboss.netty.channel.group

channel group,帮助用户维护channel列表

org.jboss.netty.channel.local

一种虚拟传输方式,允许同一个虚拟机上的两个部分可以互相通信

org.jboss.netty.channel.socket

TCP, UDP接口,继承了核心的channel API

org.jboss.netty.channel.socket.nio

基于nio的Socket channel实现

org.jboss.netty.channel.socket.oio

基于老io的Socket channel实现

org.jboss.netty.channel.socket.http

基于http的客户端和相应的server端的实现,工作在有防火墙的情况

Channel的核心包结构如下图所示:


4.  handler

org.jboss.netty.handler

处理器

org.jboss.netty.handler.codec

编码解码器

org.jboss.netty.handler.execution

基于Executor的实现

org.jboss.netty.handler.queue

将event存入内部队列的处理

org.jboss.netty.handler.ssl

基于SSLEngine的SSL以及TLS实现

org.jboss.netty.handler.stream

异步写入大数据,不会产生outOfMemory也不会花费很多内存

org.jboss.netty.handler.timeout

通过Timer来对读写超时或者闲置链接进行通知

 

5.  Netty的事件模型

 

5.1.  Netty Pipline

                                      I/O Request
                                     via Channel or
                                 ChannelHandlerContext
                                           |
  +----------------------------------------+---------------+
  |                  ChannelPipeline       |               |
  |                                       \|/              |
  |  +----------------------+  +-----------+------------+  |
  |  | Upstream Handler  N  |  | Downstream Handler  1  |  |
  |  +----------+-----------+  +-----------+------------+  |
  |            /|\                         |               |
  |             |                         \|/              |
  |  +----------+-----------+  +-----------+------------+  |
  |  | Upstream Handler N-1 |  | Downstream Handler  2  |  |
  |  +----------+-----------+  +-----------+------------+  |
  |            /|\                         .               |
  |             .                          .               |
  |     [ sendUpstream() ]        [ sendDownstream() ]     |
  |     [ + INBOUND data ]        [ + OUTBOUND data  ]     |
  |             .                          .               |
  |             .                         \|/              |
  |  +----------+-----------+  +-----------+------------+  |
  |  | Upstream Handler  2  |  | Downstream Handler M-1 |  |
  |  +----------+-----------+  +-----------+------------+  |
  |            /|\                         |               |
  |             |                         \|/              |
  |  +----------+-----------+  +-----------+------------+  |
  |  | Upstream Handler  1  |  | Downstream Handler  M  |  |
  |  +----------+-----------+  +-----------+------------+  |
  |            /|\                         |               |
  +-------------+--------------------------+---------------+
                |                         \|/
  +-------------+--------------------------+---------------+
  |             |                          |               |
  |     [ Socket.read() ]          [ Socket.write() ]      |
  |                                                        |
  |  Netty Internal I/O Threads (Transport Implementation) |
  +--------------------------------------------------------+

 

处理方式:

ChannelPipelinep = Channels.pipeline();

p.addLast("1", newUpstreamHandlerA());

p.addLast("2", newUpstreamHandlerB());

p.addLast("3", newDownstreamHandlerA());

p.addLast("4", newDownstreamHandlerB());

p.addLast("5", newUpstreamHandlerX());

Upstream: 1 –> 2 –> 5 顺序处理

Downstream: 4 –> 3 逆序处理

 

5.2.  ChannelState

 

Direction

State

Value

Meaning

Upstream

OPEN

true

The channel is open.

Upstream

OPEN

false

The channel is closed.

Upstream

BOUND

SocketAddress

The channel is bound to a local address.

Upstream

BOUND

null

The channel is unbound to a local address.

Upstream

CONNECTED

SocketAddress

The channel is connected to a remote address.

Upstream

CONNECTED

null

The channel is disconnected from a remote address.

Upstream

INTEREST_OPS

an integer

The channel interestOps has been changed.

Downstream

OPEN

true

N/A

Downstream

OPEN

false

Close the channel.

Downstream

BOUND

SocketAddress

Bind the channel to the specified local address.

Downstream

BOUND

null

Unbind the channel from the current local address.

Downstream

CONNECTED

SocketAddress

Connect the channel to the specified remote address.

Downstream

CONNECTED

null

Disconnect the channel from the current remote address.

Downstream

INTEREST_OPS

an integer

Change the interestOps of the channel.

 

5.3.  Upstreamevents

Event name

Event type and condition

Meaning

"messageReceived"

MessageEvent

a message object (e.g. ChannelBuffer) was received from a remote peer

"exceptionCaught"

ExceptionEvent

an exception was raised by an I/O thread or a ChannelHandler

"channelOpen"

ChannelStateEvent
(state = OPEN, value = true)

a Channel is open, but not bound nor connected

"channelClosed"

ChannelStateEvent
(state = OPEN, value = false)

a Channel was closed and all its related resources were released

"channelBound"

ChannelStateEvent
(state = BOUND, value = SocketAddress)

a Channel is open and bound to a local address, but not connected

"channelUnbound"

ChannelStateEvent
(state = BOUND, value = null)

a Channel was unbound from the current local address

"channelConnected"

ChannelStateEvent
(state = CONNECTED, value =SocketAddress)

a Channel is open, bound to a local address, and connected to a remote address

"writeComplete"

WriteCompletionEvent

something has been written to a remote peer

"channelDisconnected"

ChannelStateEvent
(state = CONNECTED, value = null)

a Channel was disconnected from its remote peer

"channelInterestChanged"

ChannelStateEvent
(state = INTEREST_OPS, no value)

a Channel's interestOps was changed

 

5.4.  Downstreamevents

Event name

Event type and condition

Meaning

"write"

MessageEvent

Send a message to the Channel.

"bind"

ChannelStateEvent
(state = BOUND, value = SocketAddress)

Bind the Channel to the specified local address.

"unbind"

ChannelStateEvent
(state = BOUND, value = null)

Unbind the Channel from the current local address.

"connect"

ChannelStateEvent
(state = CONNECTED, value = SocketAddress)

Connect the Channel to the specified remote address.

"disconnect"

ChannelStateEvent
(state = CONNECTED, value = null)

Disconnect the Channel from the current remote address.

"close"

ChannelStateEvent
(state = OPEN, value = false)

Close the Channel.

 

6.  Netty VS Mina

Netty基于Pipeline处理,Mina基于Filter过滤

Netty的事件驱动模型具有更好的扩展性和易用性

Https,SSL,PB,RSTP,Text&Binary等协议支持

Netty中UDP传输有更好的支持

官方测试Netty比Mina性能更好

论文阅读笔记---Deep HDR Video from Sequences with Alternating Exposures Kalantari N K, Ramamoorthi R. Deep HDR Video from Sequences with Alternating Exposures[C]//Computer Graphics Forum. 2019, 38(2): 193-205. 摘要: 在本文中,提出了一种基于学习的方法来,我们使用两个顺序卷积神经网络(CNN)对整个HDR视频重建过程进... 阅读详情

相关推荐

华为项目TR5评审后发现了重大缺陷的应急处理经验

华为TR5评审后发现重大缺陷时,启动分级应急机制:1)缺陷分级:按严重性(致命/严重/一般)评估影响;2)应急响应:跨部门会议制定方案,冻结生产并调配资源;3)根因修复:通过RCA定位问题,设计变更后回归测试;4)变更管理:评审修复影响,调整发布策略;5)持续改进:记录缺陷闭环,优化流程。案例显示,软件闪退问题通过热修复补丁和代码重构解决。关键工具包括Jira、FMEA等,确保缺陷在量产前拦截,降低风险。

从技术实践立足,从项目管理方法论延伸思考 1069

Netty 核心源码解析

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

weixin_41385912的博客 1万+

药物重定位实战:如何用反向找靶技术挖掘老药新用(附Python代码示例)

本文详细介绍了药物重定位中的反向找靶技术,通过分子相似性计算、机器学习模型和结构对接等方法,挖掘已有药物的新治疗潜力。附Python代码示例,帮助读者快速实现从分子结构到潜在靶标的智能预测,显著提升药物研发效率。

weixin_28726671的博客 259

Netty源码深度解析

最后做一个小的总结,下图是我在网上,充分说明了Netty框架的运行模式,它是基于Reactor模型的主从架构:需要创建两个线程组EventLoopGroup,即bossGroup和workerGroup,一般bossGroup设置的线程组中线程的数量为1(也可以设置>1,如果这样设置的话,就需要绑定其他的端口,设置几个,绑定几个端口),workerGroup设置的线程组是多个,不设置默认创建的线程数量为 CPU核心数×2。今天,聊一聊Netty源码。因此,Netty使用。

weixin_41338970的博客 2280

Wireshark时间分析实战:精准调试网络延迟与时间同步问题

本文深入探讨了Wireshark在网络延迟与时间同步问题分析中的核心应用。通过实战案例,详细讲解了如何设置时间显示格式、利用时间参考点量化关键路径延迟,以及运用时间平移功能校正错位时间轴。掌握这些时间分析技巧,能帮助网络工程师精准定位隐藏于数据包时序中的性能瓶颈与故障根源。

weixin_29290963的博客 262

强化学习:Distributed PPO (DPPO) 学习笔记

DPPO = Distributed + Proximal Policy Optimization Distributed:多个智能体并行训练 Proximal:限制策略更新幅度,确保稳定性 Policy Optimization:基于策略梯度的优化方法 核心思想:多个智能体并行探索环境,共享经验,通过裁剪策略更新确保训练稳定

只是个人学习笔记 1331

Netty核心技术十--Netty 核心源码剖析

每当ServerSocket创建一个新的连接,就会创建一个Socket,对应的就是目标客户端。每一个新创建的Socket 都将会分配一个全新的 ChanneIPipeline(以下简称 pipeline)每一个ChannelPipeline内部都含有多个ChannelHandlerContext(以下简称 Context)他们一起组成了双向链表,这些Context 用于包装我们调用addLast 方法时添加的ChannelHandler (以下简称handler)关系图。

qq_31745863的博客 3035

CPU、Core、RISC、ARM等的前世今生

CPU、Core、RISC-V 、ARM、ASIC、FPGA、SOC概念及区分

nxin168的博客 1015

Netty 源码解析(上)

netty源码解析

黄裳博客 3412

LeRobot 宇树人形机器人 G1 部署 GR00T 运动策略

本文详细介绍了Unitree G1人形机器人的完整设置流程。首先通过以太网连接机器人并进行SSH访问,然后配置WiFi网络实现无线连接。在机器人端安装LeRobot软件并运行服务器程序,最后在控制端配置IP地址并运行GR00T移动控制系统。指南涵盖了29自由度和23自由度版本G1机器人的配置方法,支持通过WiFi进行远程策略部署,提供双足行走与平衡控制功能,并详细说明了遥控器操作方式。

2506_90492529的博客 2172

天地图下载带审图号(审图号: GS(2024)0650号)的 “行政区划” 数据(含shp文件下载地址)

在科研投稿论文过程中,多数期刊杂志要求我们制作涉及国界的图件,必须使用自然资源部地图技术审查中心发布的标准地图底图。如地理学报、地理科学等期刊的投稿指南中写到:非标准底图本刊不予发表!(如图1.1所示)如果一定要用,凡涉国界图件(国内部分地区、全国、世界部分地区、全球)必须使用自然资源部标准地图服务系统标准地图底图(http://bzdt.ch.mnr.gov.cn/)(如图1.1所示)或国家测绘局地理信息局标准地图底图(如图1.2所示),所用底图边界要完全无修改(包括南海诸岛位置)。

JData_Engineer的博客 2303

Netty简单概述

  本文开始给大家介绍Netty相关的内容,本篇主要介绍的是Netty概念性相关的内容 Netty概述 1. 原生NIO存在的问题 NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 React...

波波烤鸭的博客 2679

通过傅里叶变换进行音频变声变调

在游戏或者一些特殊场景下为了提高娱乐性或者保护声音的特征,我们会对音频进行变声变调处理。

yang1fei2的博客 1815

python netty_Netty源码解读(一)概述

感谢网友【黄亿华】投递本稿。Netty和Mina是Java世界非常知名的通讯框架。它们都出自同一个作者,Mina诞生略早,属于Apache基金会,而Netty开始在Jboss名下,后来出来自立门户netty.io。关于Mina已有@FrankHui的Mina系列文章,我正好最近也要做一些网络方面的开发,就研究一下Netty的源码,顺便分享出来了。 Netty目前有两个分支:4.x和3.x。4.0分...

weixin_39601794的博客 529

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Netty探秘——Netty概述与总结

Netty是一款异步的事件驱动的网络应用框架、支持快速的开发可维护的高性能的面向协议的服务器和客户端。

溯夜,逆流而上 382

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

netty概述

netty概述:Netty是由JBoss提供的一个java开源框架。Netty提供异步的、基于事件驱动的网络应用程序框架,用一开发高性能,高可靠的io程序Netty可以帮助你快速、简单构建一个网络应用,相当于简化和流程化了NIO的开发过程Netty是目前最流行的NIO框架,Netty在互联网领域、大数据分布计算领域、游戏行业、通信行业都获得了广泛的应用,知名的ES、Dubbo框架内部都采用了Netty。

爪哇人的博客 608

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Netty —— 概述

文章目录原生 NIO 存在的问题官网介绍Netty 官网说明Netty 的优点Netty 版本说明 原生 NIO 存在的问题 1)NIO 的类库和 API 繁杂,使用麻烦;需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等 2)需要具备其它的额外技能;要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序 3)开发工作量和难度都非常大;例如客户

Woo_home的博客 5230

[Netty] Netty概述

原生NIO问题 NIO的类库的API繁杂,使用麻烦。 开发工作量大,需要if判断不同的情况,如网络断开等情况需要重复处理。 NIO存在Epoll Bug 导致选择器空轮空 Netty netty是一个异步的基于事件驱动的网络应用框架,快速的开发高性能的service和clients Netty支撑多种协议 https://netty.io/index.html 建构设计 线程模型 目前存在的线程模型: 传统阻塞IO模型 Reactor模式 根据Reactor的数量和处理资源池线程的数量的不同又

GxDong_的博客 259

【Netty入门】Netty概述

1.Netty简介Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果,比Mina更高效。2.Netty的特点(1) 使用更高效的socket底层,对epoll空轮询引起的cpu占用飙升在内部进行了处理

白夜行 1833

Netty07——Netty概述

一、概述  原生NIO存在很多问题:   ①NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、 SocketChannel、ByteBuffer 等;   ②需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序;   ③开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等;  

如不來的博客 247

netty系列之:netty架构概述

Netty为什么这么优秀,它在JDK本身的NIO基础上又做了什么改进呢?它的架构和工作流程如何呢?请走进今天的netty系列文章之:netty架构概述。

程序那些事 6197
上一篇: Redis客户端-Jedis源代码探索
下一篇: spring jdbc操作
我是一只懒虫
博客等级 码龄17年 147粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值