Netty(五)—服务端小记

“解密Netty中的BossGroup与WorkerGroup:他们之间的默契和配合“ 欢迎来到今天的博客,我们将深入探讨Netty中两个重要的线程池——BossGroup和WorkerGroup的关系。这两者之间的协同工作是Netty高效网络通信的关键。通过本文的解析,希望你能更好地理解它们的作用和配合方式。 阅读详情

Netty服务端

  • Netty客户端程序员启动需要使用 Bootstrap 对象
  • 和客户端不同,服务端使用 ServerBootStrap 对象来启动

Server代码实现

  • 通过和客户端代码实现对比,可以发现
    • 服务端设置了两个EventLoopGroup对象,分别用于处理客户端连接请求和处理IO操作
    • 与客户端实现不同 服务端使用 ServerBootstrap 来实现程序启动
    • 使用 ServerBootstrap 的 bind 方法来启动服务
public void start(int port) {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .option(ChannelOption.SO_BACKLOG, 1024)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        public void initChannel(SocketChannel ch) throws Exception {
                            ChannelPipeline pipeline = ch.pipeline();
                            ...
                        }
                    });
            ChannelFuture f = b.bind(this.port).sync();
            log.info("服务已启动,监听端口" + this.port);
            f.channel().closeFuture().sync();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }
  • 服务端使用ServerBootstrap而非Bootstarp
  • ServerBootstrap同样提供channel方法设置Channel Type
    • 完成实例化操作的对象是 ReflectiveChannelFactory,通过反射调用到 NioServerSocketChannel 的构造方法

NioServerSocketChannel初始化和注册

  • 客户端使用Channel Type为NioSocketChannel
  • 与客户端不同的,服务端的入口是ServerBootstrap的bind方法,然后调用到父类的 doBind 方法完成 初始化和注册

在这里插入图片描述

  • 与客户端不同的一点是,服务端传入参数是 SelectionKey.OP_ACCEPT ,表示服务启动后要监听客户端的连接请求

在这里插入图片描述

  • 在服务端由于有两个EventLoopGroup,所以Channel的注册与客户端略有不同
  • 在initAndRegister方法中,首先完成了bossGroup和NioServerSocketChannel的关联
  • 接下来在init方法中完成了workerGroup和NioServerSocketChannel的关联
  • 当一个客户端连接发送到服务端时,Java底层NIO的ServerSocketChannel会有已经初始化完成的 SelectionKey.OP_ACCEPT就绪
  • 由NioServerSocketChannel的doReadMessages方法通过调用javaChannel().accept()方法获取建立连接的SocketChannel对象

bossGroup和workerGroup

  • 客户端初始化流程的时候实例化了一个EventLoopGroup对象
  • 而服务端实例化了两个EventLoopGroup对象,其工作模型如下

在这里插入图片描述

  • 服务端bossGroup不断监听是否有客户端的连接,当拿到一个连接之后,bossGroup初始化各项资源
  • 然后workerGroup中选出一个EventLoop与目标连接建立绑定
  • 接下来与客户端的交互过程在分配的 EventLoop 中完成

Selector事件轮询

  • 服务端启动由ServerBootstrap的bind()方法开始,调用到AbstractBootstrap的doBind方法

在这里插入图片描述

  • doBind0 方法,这里调用了 与 channel关联的 EventLoop 的execute方法 AbstractBootstrap -> doBind0

在这里插入图片描述

  • 接下来调用到 SingleThreadEventExecutor 的 execute 方法
  • 这里主要做的事情就是创建线程,将线程添加到EventLoop的队列中去

在这里插入图片描述

  • startThread() 方法

在这里插入图片描述

  • SingleThreadEventExecutor.this.run方法,这里的this实际上时EventLoop对象
    • 这里实现了具体的轮询逻,体现了java NIO中的 select() 方法
    protected void run() {
        for (;;) {
            try {
                switch (selectStrategy.calculateStrategy(selectNowSupplier, hasTasks())) {
                    case SelectStrategy.CONTINUE:
                        continue;
                    case SelectStrategy.SELECT:
                        select(wakenUp.getAndSet(false));
                        if (wakenUp.get()) {
                            selector.wakeup();
                        }
                    default:
                }
                cancelledKeys = 0;
                needsToSelectAgain = false;
                final int ioRatio = this.ioRatio;
                if (ioRatio == 100) {
                    try {
                        processSelectedKeys();
                    } finally {
                        // Ensure we always run tasks.
                        runAllTasks();
                    }
                } else {
                    final long ioStartTime = System.nanoTime();
                    try {
                        processSelectedKeys();
                    } finally {
                        final long ioTime = System.nanoTime() - ioStartTime;
                        runAllTasks(ioTime * (100 - ioRatio) / ioRatio);
                    }
                }
            } catch (Throwable t) {
                handleLoopException(t);
            }
            try {
                if (isShuttingDown()) {
                    closeAll();
                    if (confirmShutdown()) {
                        return;
                    }
                }
            } catch (Throwable t) {
                handleLoopException(t);
            }
        }
    }

本文总结

  • Netty作为服务端程序启动与客户端的区别
  • 服务端使用NioServerSocketChannel进行初始化和注册的基本过程
  • boosGroup与workerGroup的区别及其工作模型
  • 跟踪源码找到了相关代码,体现了selector的轮询机制
ubuntu 24.04安装ros1 noetic 上面是参考链接给的修改内容。除了上面要修改的地方,我在编译的生活还有一个地方报错,修改成如下形式。因为我已经对文件rosconsole_log4cxx.cpp作了上面的修改,所有是不是188行不太确认了,如果报“log4cxx::spi::LocationInfo”问题,按照下面修改就可以了。我在编译时还报了一个问题,就是我之前安装的是jazzy。所以在编译时会报ros变量名不对,这时对变量名做修改就可以了。具体怎么修改,百度。a、将源文件中所有CMakelist中编译标准改为c++ 17. 阅读详情

相关推荐

实战测评:4大搜索API(You.com/Tavily/Exa/Perplexity)谁更适合你的AI项目?附Python调用代码

本文实战测评了You.com、Tavily、Exa和Perplexity四大搜索API在AI项目中的集成应用,详细对比了它们的技术特性和Python调用方法。针对LLM实时数据需求,You.com的优化设计表现突出,支持32k大上下文窗口和快速响应。文章提供了完整的代码示例和场景化选型建议,帮助开发者高效集成搜索API到AI项目中。

weixin_42569329的博客 479

netty 理论知识(个人笔记)

Echo(helloworld) 什么是Echo服务:就是一个应答服务(回显服务器),客户端发送什么数据,服务端就响应的对应的数据 1)EventLoop和EventLoopGroup 2) Bootstrapt启动引导类 3)Channel 生命周期,状态变化 4)ChannelHandler和ChannelPiplin...

灰猫 486

信息奥赛课课通(C++)p154-1近似排序

试题描述 读入一对正整数,将这两个数之间(包括这两个数本身)的所有数按下述特别规则排序后输出,该特别规则是按两数倒过来的值进行比较决定其大小,如30倒过来为3,29倒过来为92,则29大于30. 输入要求 1行,包含两个用空格隔开的自然数,这两个自然数给出了待排序数的范围,其中1≤第一个数≤第二个数≤999999999,两个数之差不超过100. 输出要求 输出排序后的数据,每行输出...

mengdicfm的博客 7283

Netty学习笔记

个人总结

weixin_42274562的博客 1192

联想Win10改Win7设置BIOS指南

通过本文的指南,你应该能够成功地在联想Win10电脑上设置BIOS以支持Windows 7的安装和运行。尽管Windows 10提供了许多现代化的功能和改进,但如果你因特定需求而更倾向于使用Windows 7,那么本文提供的步骤将帮助你顺利实现这一转换。请记住,在更改操作系统前务必做好充分的准备工作,并在安装过程中保持耐心和细心。祝你安装顺利!

mmoo_python的博客 2040

论文复现5:UMI Universal Manipulation Interface

UMI 采用手持式夹具,加上精心的界面设计,可实现便携式、低成本和信息丰富的数据收集,以进行具有挑战性的双手和动态操作演示。配备这些功能后,UMI 框架解锁了新的机器人操作功能,只需更改每个任务的训练数据,即可实现零样本可推广的动态、双手、精确和长视野行为。我们通过全面的现实世界实验展示了 UMI 的多功能性和有效性,其中通过 UMI Zeroshot 学习的策略在对不同的人类演示进行训练时可以推广到新的环境和对象。项目主页:https://umi-gripper.github.io/

github_38060285的博客 1976

线程池线程数正确设置

Java线程池线程数正确设置

xuanfenglover的专栏 1247

Prometheus+Grafana+alertmanager+PrometheusAlert监控告警 实现飞书告警

以上 是以grafana做的邮件告警,但是感觉邮件很少人看。下面是以webhook 可以接入。启动alertmanager (设置 开机在启动)下载prometheusalter 配置文件。这里的告警是基于grafana上搭建的。我们启动PrometheusAlert。写完之后进行重启Prometheus。prometheus 的告警规则。测试 基于我们生产环境做的文档。然后在grafana上导模板。上导入模板就可以 直接引用。访问 grafana页面。重启一下grafana。

墨痕诉清风的博客 859

java netty学习小记

1.对于“上下文对象设计模式”的理解 简单直观: (以文档举例) 除文档的实际文本之外的信息,例如发送日期,发件人的身份,收件人的身份,路由信息和回执。 在大多数框架(进而是设计模式)中,上下文对象存储有关传入请求和确证响应的信息。 2.netty简介 参考网站:https://blog.youkuaiyun.com/zengdongwen/article/details/96872074 基于NIO(多路复用:连接、读、写)的网络编程框架。服务端(下图)通常采用一个线程池(BossGroup)负责..

lantuxin的博客 920

大厂硬件笔试机试题ASIC设计方向-卷3

本文提供了30道硬件工程师机试题目,涵盖数字逻辑、模拟电路、CMOS和信号处理等核心领域。选择题和判断题均配有详细解析,重点考察Verilog编程、CMOS特性、触发器设计、采样定理等知识点。题目难度适中但覆盖面广,如Verilog中阻塞/非阻塞赋值的区别、CMOS静态功耗来源、Nyquist采样定理、通用逻辑门判断等。备考建议强调掌握逻辑门设计、Verilog时序电路编写和CMOS特性理解。这些题目反映了华为等大厂硬件机试的典型考查内容,通过系统复习可有效提升机试成绩,为后续面试奠定基础。

启芯硬件的博客 545

Vue3 - 完美解决 vite 打包后在本地浏览器直接打开运行,build 打包后双击 index.html 直接以 file 协议运行网站(资源、接口等正常访问,和部署到服务器运行效果一样)

vue3vite怎么支持file协议本地打开,vite打包文件如何支持files协议,支持双击即可打开网页,vue3vite打包后双击本地运行,vue3vite打包后怎么直接在浏览器双击打开访问,vite打包后显示空白,vite如何支持本地file协议打开,vue3vite打包后如何本地查看网站,vue3vite项目打包后本地启动白屏怎么办,vite打包后的代码如何在本地运行,vite+vue3打包在fIle本地index.html打开项目,打包后如何直接打开index.html文件,vue3

🏆 前端领域优质创作者 1万+

基于netty的web socket小记

1、WebSocketProtocolHandler里面包含了handshake过程,并且会在handshake完成之后产生一个用户事件往后面的管道传递,可以通过该事件判断web socket是否建立成功。ping、pong心跳帧已经在该handler中处理,管道后面的handler可以不用处理。 2、在web socket服务器开发的时候,会用到http codec相关的handler,这些h

m47838704的专栏 620

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

《Netty实战》阅读小记

Netty,一个构建高度可伸缩的、异步的、事件驱动的网络编程应用的工具包。 Netty是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端。 ...

路漫漫,等风来 260

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Netty学习小记

Netty提供了方便快速的API用于搭建网络, 一下是我学习Netty后的一些小笔记 Netty的线程模型 Netty使用React线程模型 具体Netty服务端的初始化如下 public final class SecureChatServer { static final int PORT = Integer.parseInt(System.getProperty("p

485

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Netty知识点小记

Netty知识点小记

runningo的博客 252

Netty通信框架Java实现小记

1、Netty介绍    Netty通俗地说就是一套Socket通信框架,提供异步的、事件驱动的网络应用程序框架和工具,可快速开发高性能、高可靠性的网络服务器和客户端程序 2、Netty的特性    1)设计       统一的API,适用于不同的协议(阻塞和非阻塞)       基于灵活、可扩展的事件驱动模型       高度可定制的线程模型       可靠的无连接数据Soc

医疗影像检索 4910

Netty小记——web socket分片聚合实现

在netty中已经对web socket的分片重组进行了相应的实现,具体的实现类是 WebSocketFrameAggregator,该类继承自netty的消息聚合器MessageAggregator。 MessageAggregator ...... * @param the type that covers both start message and content messag

m47838704的专栏 1739

学习小记-Netty

Netty是由JBOSS个java开源框架,Netty提供异步的、事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络服务器和客户端程序。

weixin_42029860的博客 360

Netty小记——引用计数机制

引用计数机制在很多框架中都有使用,如果在游戏引擎框架coscos2dx中,这种机制可以很简单的进行对象的生命周期的管理,netty引用计数机制原文:http://netty.io/wiki/reference-counted-objects.html Since Netty version 4, the life cycle of certain objects are managed by t...

m47838704的专栏 1538

maven运行java main方法小记

这里有两个类的main需要支持,分别是:com.prl.nettydemo.telnet.TelnetServer(telnet服务端),com.prl.nettydemo.telnet.TelnetClient(telnet客户端) ,pom片断如下: &lt;profiles&gt; &lt;profile&gt; &lt;id&gt;telnetServer&lt;/id&...

peirenlei 161

Netty初学渐进系列

学习Netty过程中,谢了一些例程和笔记,在这里归纳一个目录,方便查阅。 一、Netty应用(一)基本模型 二、Netty应用(二)传输Protobuf数据类型 三、Netty应用(三)粘包与拆包 四、Netty应用(四)实时通信的简单实现 五、Netty应用(五)架设WebSocket服务 六、Netty应用(六)Websocket连接时携带用户名 附:Protobuf初次使用小记 ...

宝华的小岛 185

douyu小记

  douyu小记   其实douyu这个web容器的小项目比较早前就接触过,今天无意中再次看到这位作者的介绍 ,对这位作者还是很敬佩的,不仅仅是技术方面,更多的是那份毅力呀。 douyu这个项目目前主要包括下面几块 &lt;li&gt;  douyu- ajp &lt;/li&gt; &lt;span&gt; 这块是很多web容器都支持的一种协议,通常和apache进行通信来使用...

caoruntie的专栏 181

源起Netty

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34417200的博客 156

maven 运行 java_maven运行java main方法小记

这里有两个类的main需要支持,分别是:com.prl.nettydemo.telnet.TelnetServer(telnet服务端),com.prl.nettydemo.telnet.TelnetClient(telnet客户端),pom片断如下:telnetServerorg.codehaus.mojoexec-maven-plugin1.1.1testjavacom.prl.nettyde...

weixin_39625586的博客 103

【源起Netty 前传】Linux网络模型小记

引言 之前的两篇文章 FastThreadLocal怎么Fast?、ScheduledThreadPoolExecutor源码解读 搞的我心力交瘁,且读源码过程中深感功力不足,遂决定“磨刀”——先达到较熟练使用netty的程度,再回过头来继续啃源码!至于“磨刀石”嘛,选择了《Netty权威指南》(第二版)……哎呦,不错奥! 正文 其实本篇...

weixin_34004576的博客 143
上一篇: Netty(四)—客户端流程
下一篇: Netty(六)—关于Pipeline
隙间光点
博客等级 码龄10年 29粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值