12.Netty入门案例

news/2024/5/21 3:10:47

1.引入Netty依赖

<dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.39.Final</version></dependency>

2.服务端

public class HelloServer {public static void main(String[] args) {// 1.启动器,负责组装Netty组件,启动服务器new ServerBootstrap()// 2.BossEventLoop,WorkerEventLoop(selector,thread),group组.group(new NioEventLoopGroup())// 3.选择服务器的ServerSocketChannel 实现.channel(NioServerSocketChannel.class) // NIO,BIO,OIO// 4.Boss负责处理连接,worker(child)负责处理读写,决定了worker(child)能执行哪些操作handler.childHandler(// 5. channel代表和客户端进行数据读写的通道 Initializer初始化,负责添加别的handlernew ChannelInitializer<NioSocketChannel>() {@Override // 连接建立后被调用protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {// 6. 添加具体的handlernioSocketChannel.pipeline().addLast(new StringDecoder()); //将ByteBuf 转换为字符串nioSocketChannel.pipeline().addLast(new ChannelInboundHandlerAdapter(){ // 自定义handler// 读事件@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {//打印上一个handler已经处理好的字符串System.out.println(msg);}});}})// 7. 绑定监听端口.bind(8888);}
}

第二步中NioEventLoopGroup,会有一个线程不断循环,配合选择器selector,监测accept、read等事件。

当accept事件发生以后,也就是连接建立以后,由某个一EventLoop对象处理,才会去执行第六步中的initChannel方法。

3.客户端

public class HelloClient {public static void main(String[] args) throws InterruptedException {// 1.启动器,负责组件netty组件,启动客户端new Bootstrap()// 2. 添加 EventLoop(BossEventLoop,WorkerEventLoop(selector, thread)),group组.group(new NioEventLoopGroup())// 3. 选择客户端的SocketChannel实现.channel(NioSocketChannel.class)// 4. 添加处理器.handler(// 5. channel代表和客户端进行数据读写的通道 Initializer初始化,负责添加别的handlernew ChannelInitializer<NioSocketChannel>() {@Override // 连接建立后被调用protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {nioSocketChannel.pipeline().addLast(new StringEncoder()); //将String-> ByteBuf}})// 6.连接到服务端.connect(new InetSocketAddress("localhost", 8888)).sync().channel()// 7.向服务端发送数据.writeAndFlush("hello netty");}
}

sync方法是阻塞方法,客户端与服务端连接建立成功才会继续执行。然后服务端的NioEventLoopGroup中的某一个EventLoop就会处理accept事件。

客户端发送了数据writeAndFlush方法后,就会去执行pipeline上的具体的每个handler中的方法,比如会执行StringEncoder Handler,也就是出栈,将String转成ByteBuf对象。

然后服务端的 NioEventLoopGroup中的某一个EventLoop就会处理read事件。

服务端接收到数据,会执行StringDecoder Handler,也就是入栈,将ByteBuf对象转成String对象。再传递给下一个handler,直接将消息打印到控制台。

channel理解为数据通道。

msg理解为流动的数据,最开始输入ByteBuf,经过pipeline加工,会变成其他类型的对象,最后输出有变成ByteBuf对象。

handler理解为数据的处理工序,工序有多道,合在一起就是pipeline,传播给每个handler,handler对自己感兴趣的事件进行处理。handler分为InBound入栈和OutBound出栈两类。

eventLoop理解为处理数据的工人,就是selector和Thread,工人可以管理多个channel的io操作,并且工人一旦负责了某个channel,就要负责到底(绑定)。工人按照pipeline顺序,依次按照handler的代码处理数据(入栈、出栈)。eventLoop就是一个单线程的线程池。


http://www.mrgr.cn/p/85418032

相关文章

Java毕设之学院党员管理系统的设计与实现

运行环境 环境说明: 开发语言:java 框架:springboot&#xff0c;vue JDK版本:JDK1.8 数据库:mysql5.7(推荐5.7&#xff0c;8.0也可以) 数据库工具:Navicat11 开发软件:idea/eclipse(推荐idea) Maven包:Maven3.3.9 系统实现 管理员功能实现 党员管理 管理员进入指定功能操作…

element ui的table多选

使用el-table的selection-change事件来获取选中的值&#xff1b; 例&#xff1a; html代码&#xff1a; <el-button type"primary" click"openTableSet">列表设置</el-button><!-- 列表设置弹框 --> <el-dialog :close-on-click-mo…

【专题】中国银行业2023年发展回顾及2024年展望报告合集PDF分享(附原数据表)

原文链接 :https://tecdat.cn/?p=36145 原文出处:拓端数据部落公众号 2023年,尽管面临全球经济复杂多变与国内经济多重挑战,中国银行业依然稳健前行,不仅圆满完成了社会经济发展的主要任务,还以“稳进相济,进而有为”的姿态,为实体经济的高质量发展提供了有力支撑,展望…

Docker 加持的安卓手机:随身携带的知识库(一)

这篇文章聊聊&#xff0c;如何借助 Docker &#xff0c;尝试将一台五年前的手机&#xff0c;构建成一个随身携带的、本地化的知识库。 写在前面 本篇文章&#xff0c;我使用了一台去年从二手平台购入的五年前的手机&#xff0c;K20 Pro。 为了让它能够稳定持续的运行&#xf…

力扣-题号2997

2997. 使数组异或和等于 K 的最少操作次数题目给你一个下标从 0 开始的整数数组 nums 和一个正整数 k 。 你可以对数组执行以下操作 任意次 :选择数组里的 任意 一个元素,并将它的 二进制 表示 翻转 一个数位,翻转数位表示将 0 变成 1 或者将 1 变成 0 。你的目标是让数组里…

现代移动端网络短连接的优化手段总结:请求速度、弱网适应、安全保障

1、前言 众所周之,通常开发一个移动端应用,会直接调用系统提供的网络请求接口去服务端请求数据,再针对返回的数据进行一些处理。 但对于追求用户体验的应用来说,还会针对移动网络的特性做进一步优化,包括: 1)速度优化:网络请求的速度怎样能进一步提升? 2)弱网适应:移…

第08章 IP分类编址和无分类编址

8.1 本章目标 了解IP地址的用途和种类了解分类编址和无分类编址区别掌握IP地址、子网掩码、网关概念及使用掌握子网划分及超网划分方法掌握无分类编址的改变和使用 8.2 IP地址的用途和种类 分类编址&#xff1a;造成地址的浪费&#xff0c;以及地址不够用&#xff1b;无分类编…

JavaScript数字分隔符

● 如果现在我们用一个很大的数字&#xff0c;例如2300000000&#xff0c;这样真的不便于我们进行阅读&#xff0c;我们希望用千位分隔符来隔开它&#xff0c;例如230,000,000; ● 下面我们使用_当作分隔符来尝试一下 const diameter 287_266_000_000; console.log(diameter)…

手机H5页面在IOS系统中无法获取Geolocation

需求 在开发H5页面的时候希望获取用户的地理位置信息,这里演示在用户上传图片的时候将用户的地理位置信息作为水印显示。 问题 在安卓手机使用vant-upload组件是没问题的,但是在IOS手机上有,报下面的提示信息。原因 苹果的IOS做了限制,如果需要使用IOS的服务,必须是HTTS协…

【智能优化算法】卷尾猴搜索算法(Capuchin search algorithm,CapSA)

【智能优化算法】卷尾猴搜索算法(Capuchin search algorithm,CapSA)是期刊“NEURAL COMPUTING & APPLICATIONS”&#xff08;IF 6.0&#xff09;的2021年智能优化算法 01.引言 【智能优化算法】卷尾猴搜索算法(Capuchin search algorithm,CapSA)用于解决约束和全局优化问…

【负载均衡式在线OJ项目day4】编译运行功能整合及打包网络服务

一.前言 前面两天完成了编译和运行两个子模块&#xff0c;今天的任务是完成CompileRun模块&#xff0c;它的任务如下&#xff1a; 解析来自客户端的Json字符串&#xff0c;反序列化提取编译运行需要的数据&#xff0c;即代码&#xff0c;时间限制和空间限制把代码写入临时文件…

盘多啦使用教程

为什么要做副业 不管是在疫情前还是疫情后,相对于普通人来说,本质工作仅仅是能够负担起正常的生活开支。反而副业才是你真正的收入。有些人会通过股票、基金等等金钱上的投资去赚取这部分的收入,但是往往伴随着高风险、高收益。那有没有什么副业是“安全,无副作用”的呢,答…

25-有参转录组实战11-上传转录组到NCBI

上传转录组到NCBI登录NCBI>点击submit>选SRA>选Project>点New submission 1 SUBMITTER 填写名字,邮件,no group,学校学院,街道邮编国家,continue 2 GENERAL INFO 填no BioProject, no BioSample,立马释放数据。 3 PROJECT INFO 填个title和description,no…

项目冲刺day3

这个作业属于哪个课程 软工4班这个作业要求在哪里 作业要求1.会议1. 照片 时间冲突,采用微信聊天方式2. 昨日已完成: 完成登录、注册功能,部分完成用户中心功能3.今天计划完成的工作 用户中心功能、订单管理功能4.工作中遇到的困难 沟通和信息共享并不总是顺利。这导致了一些…

MySQL面试必备二之binlog日志

本文首发于公众号:Hunter后端 原文链接:MySQL面试必备二之binlog日志关于 binlog,常被问到几个面试问题如下:binlog 是什么 binlog 都记录什么数据 binlog 都有哪些类型,都有什么特点 如何使用 binlog 恢复数据 binlog 都有哪些作用 binlog 属于逻辑日志还是物理日志基于上…

Transformers中加载预训练模型的过程剖析

使用HuggingFace的Transformers库加载预训练模型来处理下游深度学习任务很是方便,然而加载预训练模型的方法多种多样且过程比较隐蔽,这在一定程度上会给人带来困惑。因此,本篇文章主要讲一下使用不同方法加载本地预训练模型的区别、加载预训练模型及其配置的过程,藉此做个记…

Android GPU渲染屏幕绘制显示基础概念(1)

Android GPU渲染屏幕绘制显示基础概念&#xff08;1&#xff09; Android中的图像生产者OpenGL&#xff0c;Skia&#xff0c;Vulkan将绘制的数据存放在图像缓冲区中&#xff0c;Android中的图像消费SurfaceFlinger从图像缓冲区将数据取出&#xff0c;进行加工及合成。 Surface…

开源RAG框架汇总

前言 本文搜集了一些开源的基于LLM的RAG(Retrieval-Augmented Generation)框架,旨在吸纳业界最新的RAG应用方法与思路。如有错误或者意见可以提出,同时也欢迎大家把自己常用而这里未列出的框架贡献出来,感谢~ RAG应用框架RAGFlow项目地址:https://github.com/infiniflow/…

kali中arp欺骗,连上校园网断舍友的网

首先kali的配置: 参考网站:https://jingyan.baidu.com/article/2c8c281d145cf44108252a97.html 然后下载arpspoof插件: apt-get install dsniff然后一条命令: arpspoof -i eth0 -t 受害者的ip 网关//这个网关是你自己连上校园网的那个网关

Scrum冲刺4--5.10

Scrum冲刺4--5.10这个作业属于哪个课程 软件工程这个作业要求在哪里 团队项目这个作业的目标 进行敏捷冲刺,熟悉团队合作开发前端仓库 前端后端仓库 后端每次冲刺日志索引时间 博客5.7 Day1ᕙ(`▿)ᕗ5.8 Day2ᕙ(• ॒ ູ•)ᕘ5.9 Day3(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )5.10 Day4 (…