netty启动流程
本文通过对netty服务端、客户端的启动流程分析, 让大家对netty是如何启动运行的。
废话不多说,上源码!!!
建议读者学习netty下的jar类型为 netty-example,里面有很多example可以供我们参考学习,本系列文章netty的版本为4.1.25.Final,5.X版本有重大bug官方已抛弃
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-example</artifactId>
<version>4.1.25.Final</version>
</dependency>
打开如图所示的jar位置,即可看到echo下的案例,echoserver和echoclient对应服务端启动器和客户端启动器,可直接运行

我们先来看服务端的启动流程
EventLoopGroup bossGroup = new NioEventLoopGroup(1); //用来处理accpet事件,并指定EventLoop数量为一个
EventLoopGroup workerGroup = new NioEventLoopGroup(); //用来处理后续的io事件,这里没有指定EventLoop数量 默认为CPU核心数*2
try {
ServerBootstrap b = new ServerBootstrap(); //创建一个服务端netty启动器,用来帮助服务端启动
b.group(bossGroup, workerGroup) //把刚才创建的eventloopGroup添加进去
.channel(NioServerSocketChannel.class) //服务端对应的channel类型,这里是用来创建连接时候用的
.option(ChannelOption.SO_BACKLOG, 100) //设置bossgroup得到的最大连接数
.handler(new LoggingHandler(LogLevel.INFO)) //给NioServerScoketChannel设置的处理器 该handler看名字就知道是用来打印流程日志
//上面都是设置bossgroup产生连接使用的 只对NioServerScoketChannel有效
//产生连接后会相应生成NioSocketChannel用来会后续客户端io事件的处理
.childHandler(new ChannelInitializer<SocketChannel>() { //该handler在NioSocketChannel创建的时候使用,ChannelInitializer用来帮助channel的创建
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
p.addLast(new EchoServerHandler()); //这里才是像channel添加handler
}
});
// 绑定端口并同步阻塞
ChannelFuture f = b.bind(PORT).sync();
// 监听NioServerScoketChannel的关闭事件,同步阻塞
f.channel().closeFuture().sync();
} finally {
// 结束后优雅的关闭
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
跟我们之前所述一样,服务端这边有两个EventLoopGroup,分别是bossGroup和workGroup,bossGroup仅用来处理客户端连接,完成连接后会创建一个socketchannel交给workGroup中其中一个EventLoop,后续的io操作都在这个EventLoop完成
我们再来看客户端启动流程
EventLoopGroup group = new NioEventLoopGroup(); //客户端只有一个EventLoopGroup 因为客户端连接、读写事件都是由一个channel完成
try {
Bootstrap b = new Bootstrap(); //客户端启动器
b.group(group)
.channel(NioSocketChannel.class) //指定客户端channel类型 后续创建时通过反射来实例化
.option(ChannelOption.TCP_NODELAY, true) //设置NioSocketChannel类型为tcp无延迟
.handler(new ChannelInitializer<SocketChannel>() { //帮助NioSocketChannel创建的handler
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
p.addLast(new EchoClientHandler()); //添加NioSocketChannel的handler
}
}); // 连接服务端,同步阻塞
ChannelFuture f = b.connect(HOST, PORT).sync(); // 等待客户关闭信号,同步阻塞
f.channel().closeFuture().sync();
} finally {
// 结束后记得关闭
group.shutdownGracefully();
}
客户端启动流程和服务端大致类似,差别在于服务端有一个专门处理accpet事件的NioServerScoketChannel,跟jdk中Nio一样
我们对netty服务端和客户端启动流程简单进行的阐述,先让大家有个基本印象
netty启动流程的更多相关文章
- Netty源码分析第1章(Netty启动流程)---->第3节: 服务端channel初始化
Netty源码分析第一章:Netty启动流程 第三节:服务端channel初始化 回顾上一小节的initAndRegister()方法: final ChannelFuture initAndRe ...
- Netty源码分析第1章(Netty启动流程)---->第4节: 注册多路复用
Netty源码分析第一章:Netty启动流程 第四节:注册多路复用 回顾下以上的小节, 我们知道了channel的的创建和初始化过程, 那么channel是如何注册到selector中的呢?我们继 ...
- Netty启动流程剖析
编者注:Netty是Java领域有名的开源网络库,特点是高性能和高扩展性,因此很多流行的框架都是基于它来构建的,比如我们熟知的Dubbo.Rocketmq.Hadoop等,针对高性能RPC,一般都是基 ...
- Netty源码分析第1章(Netty启动流程)---->第1节: 服务端初始化
Netty源码分析第一章: Server启动流程 概述: 本章主要讲解server启动的关键步骤, 读者只需要了解server启动的大概逻辑, 知道关键的步骤在哪个类执行即可, 并不需要了解每一步的 ...
- Netty源码分析第1章(Netty启动流程)---->第2节: NioServerSocketChannel的创建
Netty源码分析第一章: Server启动流程 第二节:NioServerSocketChannel的创建 我们如果熟悉Nio, 则对channel的概念则不会陌生, channel在相当于一个通 ...
- Netty源码分析第1章(Netty启动流程)---->第5节: 绑定端口
Netty源码分析第一章:Netty启动步骤 第五节:绑定端口 上一小节我们学习了channel注册在selector的步骤, 仅仅做了注册但并没有监听事件, 事件是如何监听的呢? 我们继续跟第一小节 ...
- netty服务端客户端启动流程分析
服务端启动流程 我们回顾前面讲解的netty启动流程,服务端这边有两个EventLoopGroup,一个专门用来处理连接,一个用来处理后续的io事件 服务端启动还是跟nio一样,绑定端口进行监听,我们 ...
- Netty 拆包粘包和服务启动流程分析
Netty 拆包粘包和服务启动流程分析 通过本章学习,笔者希望你能掌握EventLoopGroup的工作流程,ServerBootstrap的启动流程,ChannelPipeline是如何操作管理Ch ...
- 【转】Netty 拆包粘包和服务启动流程分析
原文:https://www.cnblogs.com/itdragon/archive/2018/01/29/8365694.html Netty 拆包粘包和服务启动流程分析 通过本章学习,笔者希望你 ...
随机推荐
- Scrum 冲刺第二天
一.每日站立式会议 1.会议内容 1)进行每日工作汇报 张博愉: 昨天已完成的工作:制定测试计划.博客编写 今日工作计划:测试mappe里的接口 工作中遇到的困难:对测试接触得较少 张润柏: 昨天已完 ...
- CSS基础-Flexbox
flexbox 是一种一维的布局模型,它给 flexbox 的子元素之间提供了强大的空间分布和对齐能力. 说 flexbox 是一种一维的布局,是因为一个 flexbox 一次只能处理一个维度上的元素 ...
- 如何设置10px
chrome浏览器小于12px字体默认显示12px? font-size:10px: -webkit-transform:scal(0.83):
- Big Sur 11.0.1 让2K屏幕开启Hidpi
首先来个成果图: 一.复制显示器配置文件 终端输入命令:cd /System/Library/Displays/Contents/Resources/Overrides 接着输入:open . 打开D ...
- uniapp保存图片到本地(APP和微信小程序端)
uniapp实现app端和微信小程序端图片保存到本地,其它平台未测过,原理类似. 微信小程序端主要是权限需要使用button的开放能力来反复调起,代码如下: 首先是条件编译两个平台的按钮组件: < ...
- 前端js实现九宫格模式抽奖(多宫格抽奖)
介绍: 前端九宫格是一种常见的抽奖方式,js实现如下,掌握其原理,不论多少宫格,都可以轻松应对.(代码可复制直接运行看效果). 该案例以四宫格入门,可扩展多宫格,奖品模块的布局可自由设置. <! ...
- Pytest 学习(二十五)- allure 命令行参数【转】
先看看 allure 命令的帮助文档 cmd 敲 allure -h allure 命令的语法格式 allure [options] [command] [command options] optio ...
- MySQL增强半同步的搭建实验,和一些参数的个人理解
关于参数理解,已补充实验,可以查看: rpl_semi_sync_master_wait_no_slave 参数研究实验 环境信息 role ip port hostname master 192.1 ...
- 1.pipeline原理
redis基本语法:https://www.cnblogs.com/xiaonq/p/7919111.html redis四篇:https://www.cnblogs.com/xiaonq/categ ...
- Python-其他-round()保留小数位时遇到的问题
最近有一个需求,原有整数计算,改成小数计算,保留一位小数. 于是按照需求,将数据结构由 int 改为 float ,计算时采用round()方法来保留小数位. 第一版代码如下: a = 0.10000 ...