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 拆包粘包和服务启动流程分析 通过本章学习,笔者希望你 ...
随机推荐
- WinForm 加载大数据时不闪烁的ListView
自己之前做小工具的时候,遇到这个问题,记录一下... namespace 相册处理 { //将ListView重载为此新类,解决加载过程中闪烁的问题 //在designer.cs中改写: //priv ...
- 第 4篇 Scrum 冲刺博客
一.站立式会议 1.站立式会议照片 2.昨天已完成的工作 登录信息的匹配 3.今天计划完成的工作 ①售货员页面功能 ②销售排行 4.工作中遇到的困难 ①页面按钮太过复杂,逻辑错乱 ②有的同学数据库驱动 ...
- angular 双向数据绑定与vue数据的双向数据绑定
二者都是 MVVM 模式开发的典型代表 angular 是通过脏检测实现,angular 会将 UI 事件,请求事件,settimeout 这类延迟的对象放入到事件监测的脏队列,当数据变化的时候,触发 ...
- 深入理解Java虚拟机(三)——垃圾回收策略
所谓垃圾收集器的作用就是回收内存空间中不需要了的内容,需要解决的问题是回收哪些数据,什么时候回收,怎么回收. Java虚拟机的内存分为五个部分:程序计数器.虚拟机栈.本地方法栈.堆和方法区. 其中程序 ...
- 廖雪峰官网学习js 数据类型和变量
数据类型: number 不分整数 和浮点数 字符串 用' ' " " 表示 布尔值 true false && 与运算符(都ture才ture ...
- unity入门—资源导入与场景创建
前言: 从这一篇章开始,我将会通过游戏实例来讲解如何使用unity制作一个标准的游戏,介绍的内容较多,需要整理的东西也多可能中途会有一两天的咕咕咕,预计想要完成两个游戏,一个射击类一个塔防类,从射击类 ...
- 七、TestNG传递参数2
数据提供者本身可以接受两个类型的参数:Method和ITestContext 在创建@DataProvider方法是可以有四种格式如图: 第一种在上一篇中有学到 1-Methode参数使用 @Data ...
- Spring Session解决Session共享
1. 分布式Session共享 在分布式集群部署环境下,使用Session存储用户信息,往往出现Session不能共享问题. 例如:服务集群部署后,分为服务A和服务B,当用户登录时负载到服务A ...
- IOS开发中设置导航栏主题
/** * 系统在第一次使用这个类的时候调用(1个类只会调用一次) */ + (void)initialize { // 设置导航栏主题 UINavigationBar *navBar = [UINa ...
- Kafka Connect使用入门-Mysql数据导入到ElasticSearch
1.Kafka Connect Connect是Kafka的一部分,它为在Kafka和外部存储系统之间移动数据提供了一种可靠且伸缩的方式,它为连接器插件提供了一组API和一个运行时-Connect负责 ...