本文通过对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服务端和客户端启动流程简单进行的阐述,先让大家有个基本印象

最新文章

  1. RIFF和WAVE音频文件格式
  2. oracle add_months函数
  3. OPENGL半透明图像产生黑色光环
  4. dojo分析之declare接口
  5. linux命令:mkdir命令
  6. 华人曾与IBM抗衡! 盘点已远去的IT巨头(转)
  7. EasyUI 在aspx页面显示高度不正常解决办法
  8. dojo grid 分页
  9. openstack 制作大于2TB根分区自动扩容的CENTOS镜像
  10. 关于.net的一些基础知识(一)
  11. js监听回车事件
  12. hdoj 4324 Triangle LOVE 【拓扑】
  13. MD5 SHA1 HMAC HMAC_SHA1区别
  14. 关于HttpClient上传中文乱码的解决办法
  15. bottle.py中的SimpleTemplate
  16. 记录一段QQ关于 UNIGUI 的Session 时间设定
  17. 英语口语练习系列-C28-海滨-辨别身份-悬崖边的树
  18. 我的互联网30年。永远的8U8 永远的Y365
  19. java问题排查工具之一板斧jstack——使用 jstack 定位 java进程CPU过高的问题
  20. 【WPF】拖拽ListBox中的Item

热门文章

  1. Scrum 冲刺第四天
  2. CSS绘制正五角星原理(数学模型)
  3. 重磅!Panda Global获悉立陶宛下周将发行区块链数字货币!
  4. uniapp导入导出Excel
  5. 优化Windows电脑常见方法,提高速度,释放硬盘C盘
  6. 从函数到包的Python代码层次
  7. 微信小程序 rich-text 修改照片
  8. html 09-HTML5详解(三)
  9. js上 十二、函数初步-1
  10. Jetty web server 远程共享缓冲区泄漏漏洞学习