《Netty实战》读书笔记

2023-11-18

第一章、Netty--异步和事件驱动

Netty包含网络编程、多线程处理和并发。

NIO

NIO 代表非阻塞 I/O(Non-blocking I/O)。

Netty 的核心组件

Netty 的主要构件:

  • Channel;
  • 回调;
  • Future;
  • 事件和 ChannelHandler。

Channel

Channel 是 Java NIO 的一个基本构造。
它代表一个到实体(如一个硬件设备、一个文件、一个网络套接字或者一个能够执
行一个或者多个不同的I/O操作的程序组件)的开放连接。

回调

一个回调其实就是一个方法,一个指向已经被提供给另外一个方法的方法的引用。这使得后者可以在适当的时候调用前者。

Future

  • Future 提供了在操作完成时通知应用程序的方式。

ChannelFuture提供了几种额外的方法,这些方法使得我们能够注册一个或者多个 ChannelFutureListener实例。
监听器的回调方法operationComplete(),将会在对应的操作完成时被调用。

// Does not block
。然后监听器可以判断该操作是成功地完成了还是出错了。如果是后者,我们可以检索产生的Throwable。简而言之 ,由ChannelFutureListener提供的通知机制消除了手动检查对应的操作是否完成的必要。
每个 Netty 的出站 I/O 操作都将返回一个 ChannelFuture;也就是说,它们都不会阻塞。

事件和 ChannelHandler

Netty 使用不同的事件来通知我们状态的改变或者是操作的状态。这使得我们能够基于已经发生的事件来触发适当的动作。这些动作可能是:
记录日志、数据转换、流控制、应用程序逻辑。

Netty组件总结

(1)Future、回调和 ChannelHandler。
Netty的异步编程模型是建立在Future和回调的概念之上的,而将事件派发到ChannelHandler。
(2)选择器(Selector)、事件和 EventLoop。
Netty 通过触发事件将 Selector 从应用程序中抽象出来,消除了所有本来将需要手动编写的派发代码。在内部,将会为每个 Channel 分配一个 EventLoop,用以处理所有事件,包括:
注册感兴趣的事件、将事件派发给 ChannelHandler、安排进一步的动作。
EventLoop 本身只由一个线程驱动,其处理了一个 Channel 的所有 I/O 事件,并且在该 EventLoop 的整个生命周期内都不会改变。

第二章 Netty应用程序

  • 所有的 Netty 服务器都需要以下两部分:
    (1)至少一个 ChannelHandler—该组件实现了服务器对从客户端接收的数据的处理,即它的业务逻辑。
    (2)引导—这是配置服务器的启动代码。至少,它会将服务器绑定到它要监听连接请求的端口上。

  • 服务器会响应传入的消息,所以它需要实现 ChannelInboundHandler 接口,用来定义响应入站事件的方法。
    如果应用程序只需要用到少量的这些方法,所以继承 ChannelInboundHandlerAdapter 类也就足够了,它提供了 ChannelInboundHandler 的默认实现。

channelRead()—对于每个传入的消息都要调用;channelReadComplete()—通知ChannelInboundHandler最后一次对channelRead()的调用是当前批量读取中的最后一条消息;exceptionCaught()—在读取操作期间,有异常抛出时会调用。

引导服务器

  • 引导服务器本身的过程,具体涉及以下内容:
    (1)绑定到服务器将在其上监听并接受传入连接请求的端口;
    (2)配置 Channel,以将有关的入站消息通知给 ServerHandler 实例。

服务器的主要代码组件:

  • ServerHandler 实现了业务逻辑;
  • main()方法引导了服务器;
    引导过程中所需要的步骤如下:
  • 创建一个 ServerBootstrap 的实例以引导和绑定服务器;
  • 创建并分配一个 NioEventLoopGroup 实例以进行事件的处理,如接受新连接以及读/写数据;
  • 指定服务器绑定的本地的 InetSocketAddress;
  • 使用一个 ServerHandler 的实例初始化每一个新的 Channel;
  • 调用 ServerBootstrap.bind()方法以绑定服务器。

通过 ChannelHandler 实现客户端逻辑

客户端将拥有一个用来处理数据的 ChannelInboundHandler。可以扩展 SimpleChannelInboundHandler 类以处理所有必须的任务。
要求重写下面的方法:
channelActive()——在到服务器的连接已经建立之后将被调用;
channelRead0()——当从服务器接收到一条消息时被调用;
exceptionCaught()——在处理过程中引发异常时被调用。

引导客户端

  • 为初始化客户端,创建了一个 Bootstrap 实例;
  • 创建 BootstrapEventLoopGroup 以处理客户端事件;
  • 为进行事件处理分配了一个 NioEventLoopGroup 实例,其中事件处理包括创建新的连接以及处理入站和出站数据;
  • 为服务器连接创建了一个 InetSocketAddress 实例;
  • 当连接被建立时,一个 ClientHandler 实例会被安装到(该 Channel 的)ChannelPipeline 中;
  • 在一切都设置完成后,调用 Bootstrap.connect()方法连接到远程节点;

第三章 Netty组件和设计

Channel、EventLoop 和 ChannelFuture

  • Channel—Socket;
  • EventLoop—控制流、多线程处理、并发;
  • ChannelFuture—异步通知。

Channel 接口

基本的 I/O 操作(bind()、connect()、read()和 write())依赖于底层网络传输所提
供的原语。在基于 Java 的网络编程中,其基本的构造是 class Socket。
Netty 的 Channel 接口所提供的 API,大大地降低了直接使用 Socket 类的复杂性。

  • EmbeddedChannel;
  • LocalServerChannel;
  • NioDatagramChannel;
  • NioSctpChannel;
  • NioSocketChannel。

EventLoop 接口

EventLoop 定义了 Netty 的核心抽象,用于处理连接的生命周期中所发生的事件。

一个 EventLoopGroup 包含一个或者多个 EventLoop;

  • 一个 EventLoop 在它的生命周期内只和一个 Thread 绑定;
  • 所有由 EventLoop 处理的 I/O 事件都将在它专有的 Thread 上被处理;
  • 一个 Channel 在它的生命周期内只注册于一个 EventLoop;
  • 一个 EventLoop 可能会被分配给一个或多个 Channel。

ChannelFuture 接口

Netty 提供了ChannelFuture 接口,其 addListener()方法注册了一个 ChannelFutureListener,以便在某个操作完成时(无论是否成功)得到通知。

ChannelHandler 接口

ChannelHandler,它充当了所有处理入站和出站数据的应用程序逻辑的容器。

ChannelPipeline 接口

ChannelHandler 安装到 ChannelPipeline 中的过程如下所示:

  • 一个ChannelInitializer的实现被注册到了ServerBootstrap中;
  • 当 ChannelInitializer.initChannel()方法被调用时,ChannelInitializer 将在 ChannelPipeline 中安装一组自定义的 ChannelHandler;
  • ChannelInitializer 将它自己从 ChannelPipeline 中移除。

编码器和解码器

  • 当你通过 Netty 发送或者接收一个消息的时候,就将会发生一次数据转换。入站消息会被解码;也就是说,从字节转换为另一种格式,通常是一个 Java 对象。如果是出站消息,则会发生相反方向的转换:它将从它的当前格式被编码为字节。这两种方向的转换的原因很简单:网络数据总是一系列的字节。

第4章 传输

  • NIO——非阻塞 I/O
  • 零拷贝:
    零拷贝(zero-copy)是一种目前只有在使用 NIO 和 Epoll 传输时才可使用的特性。它使你可以快速
    高效地将数据从文件系统移动到网络接口,而不需要将其从内核空间复制到用户空间,其在像 FTP 或者
    HTTP 这样的协议中可以显著地提升性能。

第6章

ChannelHandler。

  • Channel 的状态模型:ChannelUnregistered --> ChannelRegistered --> ChannelActive --> ChannelInactive
    当这些状态发生改变时,将会生成对应的事件。
    这些事件将会被转发给 ChannelPipeline 中的 ChannelHandler,其可以随后对它们做出响应。
  • Netty 定义了下面两个重要的 ChannelHandler 子接口:
    ChannelInboundHandler——处理入站数据以及各种状态变化;
    ChannelOutboundHandler——处理出站数据并且允许拦截所有的操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《Netty实战》读书笔记 的相关文章

  • 软件测试|使用matplotlib绘制多种折线图

    简介 在数据可视化领域 Matplotlib是一款非常强大的Python库 它可以用于绘制各种类型的图表 包括折线图 本文将介绍如何使用Matplotlib创建多种不同类型的折线图 并提供示例代码 创建模版 在绘图之前 我们可以先创建我们的
  • socket网络编程几大模型?看看CHAT是如何回复的?

    CHAT回复 网络编程中常见的有以下几种模型 1 阻塞I O模型 Blocking I O 传统的同步I O模型 一次只处理一个请求 2 非阻塞I O模型 Non blocking I O 应用程序轮询调用socket相关函数检查请求 不需
  • 什么是充放电振子理论?

    CHAT回复 充放电振子模型 Charging Reversal Oscillator Model 是一种解释ENSO现象的理论模型 这个模型把ENSO现象比喻成一个 热力学振荡系统 在这个模型中 ENSO现象由三个组成部分 充电 Char
  • 软件测试|使用Python读写yaml文件,你会了吗?

    简介 YAML YAML Ain t Markup Language 是一种可读的数据序列化格式 它常用于配置文件和数据交换 Python 提供了许多库来处理 YAML 文件 在本文中 我们将探讨如何使用 PyYAML 库来读取和写入 YA
  • 软件测试|教你使用Python下载图片

    前言 我一直觉得Windows系统默认的桌面背景不好看 但是自己又没有好的资源可以进行替换 突然我一个朋友提醒了我 网络上的图片这么多 你甚至可以每天换很多个好看的背景 但是如果让我手动去设置的话 我觉得太麻烦了 我不如使用技术手段将图片下
  • 【卡尔曼滤波】具有梯度流的一类系统的扩散映射卡尔曼滤波器研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据 文章
  • Android Navigation的四大要点你都知道吗?

    在JetPack中有一个组件是Navigation 顾名思义它是一个页面导航组件 相对于其他的第三方导航 不同的是它是专门为Fragment的页面管理所设计的 它对于单个Activity的App来说非常有用 因为以一个Activity为架构
  • 计算机Java项目|尤文图斯足球俱乐部网上商城系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 计算机Java项目|基于SSM的篮球系列网上商城设计与实现

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 春眠不觉晓,Java数据类型知多少?基础牢不牢看完本文就有数了

    俺滴座右铭是不在沉默中爆发 就在沉默中灭亡 一起加油学习 珍惜现在来之不易的学习时光吧 等工作之后 你就会发现 想学习真的需要挤时间 厚积薄发啦 我们知道Java是面向对象的静态型编程语言 在Java的世界里万物皆对象 但我认为是万物皆数据
  • 2024史上最全Java面试八股文(带全部答案)

    今天要谈的主题是关于求职 求职是在每个技术人员的生涯中都要经历多次 对于我们大部分人而言 在进入自己心仪的公司之前少不了准备工作 有一份全面细致 面试题 将帮助我们减少许多麻烦 在跳槽季来临之前 特地做这个系列的文章 一方面帮助自己巩固下基
  • 详解toLowerCase(判断字符串相等)

    一 toLowerCase 函数简介 toLowerCase 是一个在多个编程语言中都存在的字符串方法 它的作用是将字符串中的所有大写字母转换为对应的小写字母 常用于文本处理 搜索和比较等情况 以确保字符串的一致性和非大小写敏感的操作 二
  • 【go语言】结构体数据填充生成md错误码文件

    这里使用pongo2这个模版引擎库进行md文件渲染 GitHub flosch pongo2 Django syntax like template engine for Go package main import fmt github
  • 【go语言】读取toml文件

    一 简介 TOML 全称为Tom s Obvious Minimal Language 是一种易读的配置文件格式 旨在成为一个极简的数据序列化语言 TOML的设计原则之一是保持简洁性 易读性 同时提供足够的灵活性以满足各种应用场景 TOML
  • 【心电图基线估计和去噪方法的群稀疏正则化】带有群稀疏正则化的心电图基线估计和去噪(Matlab实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 2024年华为OD机试真题-靠谱的车-Python-OD统一考试(C卷)

    题目描述 程序员小明打了一辆出租车去上班 出于职业敏感 他注意到这辆出租车的计费表有点问题 总是偏大 出租车司机解释说他不喜欢数字4 所以改装了计费表 任何数字位置遇到数字4就直接跳过 其余功能都正常 比如 1 23再多一块钱就变为25 2
  • 学Python,一个月从小白到大神?看你怎么学!

    Python是一门超强大而且超受欢迎的编程语言 它被用在各种领域 比如网站开发 数据分析 人工智能和机器学习 学会Python会给你创造很多职业机会 所以绝对是值得一试的 但你有没有过这样的梦想 一个月时间 从Python小白变成Pytho
  • 【C#】基础巩固

    最近写代码的时候各种灵感勃发 有了灵感 就该实现了 可是 实现起来有些不流畅 总是有这样 那样的卡壳 总结下来发现了几个问题 1 C 基础内容不是特别牢靠 理解的不到位 导致自己想出来了一些内容 但是无法使用正确的C 代码实现 导致灵感无法
  • 2024最强Java面试八股文合集(持续更新)

    今天要谈的主题是关于求职 求职是在每个技术人员的生涯中都要经历多次 对于我们大部分人而言 在进入自己心仪的公司之前少不了准备工作 有一份全面细致 面试题 将帮助我们减少许多麻烦 在跳槽季来临之前 特地做这个系列的文章 一方面帮助自己巩固下基
  • Java进阶之旅第七天

    Java进阶之旅第七天 文章目录 Java进阶之旅第七天 方法引用 介绍 代码展示 结果 方法引用的分类

随机推荐

  • 【Python】六个惊人的未知 Python 库

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • MySQL安装和图形化工具Workbench

    阅读整理自 MySQL 必知必会 朱晓峰 详细内容请登录 极客时间 官网购买专栏 文章目录 安装与配置 1 选择安装类型 2 安装服务器及相关组件 3 配置服务器 4 身份验证 5 设置密码和用户权限 6 配置 Windows 服务 图形化
  • 毕业设计-基于大数据招聘岗位可视化系统-python

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度
  • compileDebugKotlin FAILED Unresolved reference: xxxx

    Task client compileDebugKotlin FAILED e MainActivity kt 64 13 Unresolved reference CommendUtils A项目引用了library 但是一直报错 解决
  • 基于A40I/T3 SDK平台的QT4.8移植和应用开发连载(四)-盈鹏飞嵌入式

    文记录了QT4 8图形界面在全志A40I T3 SDK平台上的移植过程 说明过程中可能会技术瑕疵 希望大家提供宝贵意见 本文移植的平台来自于盈鹏飞嵌入式的CoM X40I T3A平台 处理器分别时是全志的A40I T3 以下是盈鹏飞嵌入式C
  • 数据库多维迭代算法

    关键词 数据库 迭代 递归 多维 一 两种传统的数据库迭代结构算法 对于数据库的迭代结构 有两种传统的算法 递归算法和边界算法 比如对于下面图1的结构 图1 递归算法的数据结构如表1所示 节点id 节点值 父节点id 1 1111 2 3
  • USDP使用笔记(八)Flink配置及简单测试

    Flink配置Flink配置及简单测试 上一篇 https lizhiyong blog csdn net article details 123560865 将USDP2 0自带的Flink更换为Flink1 14后 还没有来得及改配置
  • pycharm如何配置Anaconda虚拟环境

    文章目录 一 Anaconda虚拟环境创建 二 pycharm添加虚拟环境 一 Anaconda虚拟环境创建 1 此电脑 右键 属性 高级系统设置 高级 环境变量 系统变量 path 新建 相应路径 Anaconda 相应路径 Anacon
  • 小程序和Vue写法的区别

    小程序和Vue写法的区别主要有以下几点 语法不同 小程序使用的是WXML WXSS和JS 而Vue使用的是HTML CSS和JSX 数据绑定方式不同 小程序使用的是双向数据绑定 而Vue使用的是单向数据流 1 在小程序中需要使用e curr
  • oracle数据库imp/sqlplus命令无效引发的问题

    好久没有使用Oracle数据库 在导入数据库dmp文件时出现imp命令无效 oracle导入dmp文件命令 imp user password ip 端口 server name file 文件路径 dmp full y 如 imp crm
  • HTML 常用快捷键,HTML介绍

    一 1 修改主题 2 3 修改 4 长代码换行 file setting general wrap 对勾选中 5 新建项目 file new project 6 关联浏览器 file setting tool web borther 复制路
  • bigdata_git版本控制系统

    一丶版本控制系统发展 集中式VCS 分布式VCS git 二丶git工作流程图 三丶分支管理 每个项目确立后可以添加多个分支 分支可以更新版本 只要分支没有合并提交 对其他人没有任何影响 这也是跟svn的不同 四丶内部数据存储方式 git统
  • 惠斯通电桥与运算放大器的输入失调电流和输入偏置电流

    在做数字开关气压表项目中 使用的气压传感器的结构是惠斯通电桥 输出差分信号 差分电压与气压大小成线性关系 运放的失调电压对精度影响很大 在这里考虑选择使用低漂移运放 在选择运放时考虑了输入电阻 失调电压的影响 如果运放的输入电阻大小与电桥电
  • 大模型训练避坑指南

    原文 https baijiahao baidu com s id 1760862056681517207 wfr spider for pc 自 2022 年 11 月底 ChatGPT 发布以来 大模型的热度持续发酵 相信高屋建瓴的讨论
  • 辛普森悖论_所谓的辛普森悖论

    辛普森悖论 We all know the Simpsons family from Disneyland but have you heard about the Simpson s Paradox from statistic theo
  • cdn缓存服务器有网站图片,CDN缓存服务器图片存储一致性hash算法的理解

    用hash做缓存 假如有三台服务器 1 2 3 有三万张图片 我想将图片平均缓存到我三台服务器上 一个服务器大概一万张 怎么去实现这个办法呢 可以用hash来取余数进行操作 加入我们是以图片的名字作为key进行hash计算 hash 图片名
  • C - 滑动窗口 /【模板】单调队列

    Description 有一个长为 n 的序列 a 以及一个大小为 k 的窗口 现在这个从左边开始向右滑动 每次滑动一个单位 求出每次滑动后窗口中的最大值和最小值 例如 The array is 1 3 1 3 5 3 6 7 and k
  • .whl is not a supported wheel on this platform的原因及其解决办法

    在PIP安装 whl文件的时候碰到这个错误 具体如下 我的python版本是3 4 4 这个错误的原因如下 可能的原因1 安装的不是对应python版本的库 下载的库名中cp27代表python2 7 其它同理 可能的原因2 下载的是对应版
  • IDEA写SQL语句时不会提示表名、列名的处理方法(实测有效)

    打出表名没有提示 下面进行设置 按照别人的设置没效果 打开设置 还是刚才的路径 要同时设置两个地方才有效
  • 《Netty实战》读书笔记

    第一章 Netty 异步和事件驱动 Netty包含网络编程 多线程处理和并发 NIO NIO 代表非阻塞 I O Non blocking I O Netty 的核心组件 Netty 的主要构件 Channel 回调 Future 事件和