博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【自己读源码】Netty4.X系列(一) 启动类概览
阅读量:5810 次
发布时间:2019-06-18

本文共 1989 字,大约阅读时间需要 6 分钟。

一些想法

这个系列想开很久了,自己使用netty也有一段时间了,利用netty也编写了一个简单的框架,并运用到工作中了,感觉还不错,趁着这段时间工作不是很忙,来分析一波源码,提升下技术硬实力。

结构

这里先看下netty包的目录结构

clipboard.png

由名字来做个大概的推测吧:

Bootstrap     顾名思义,启动类的意思Buffer        应该和读取传输数据有关Channel       负责网络连接那块Handler       这个应该是维护自身逻辑的部分,也是开发者需要开发的部分Resolver      看了下里面的类,猜测是和解析网络地址有关Util          这个很明了,工具类嘛,不过netty的工具类会很复杂

目录就像书本的目录一样,能帮助我们理清大概的头绪。

启动类

然后再看下netty的tcp标准启动类写法,我想大家应该都很熟悉了

final EventExecutorGroup group = new DefaultEventExecutorGroup(16);EventLoopGroup bossGroup = new NioEventLoopGroup(); // (1)EventLoopGroup workerGroup = new NioEventLoopGroup();try {    ServerBootstrap b = new ServerBootstrap(); // (2)    b.group(bossGroup, workerGroup)            .channel(NioServerSocketChannel.class) // (3)            .childHandler(new ChannelInitializer
() { // (4) @Override public void initChannel(SocketChannel ch) throws Exception { //添加解码器 ch.pipeline().addLast(new xxxxDecoder()); //添加编码器 ch.pipeline().addLast(new xxxxEncoder()); } }) .option(ChannelOption.SO_BACKLOG, 128) // (5) .childOption(ChannelOption.SO_KEEPALIVE, true); // (6) ChannelFuture f = b.bind(9999).sync(); // (7) f.channel().closeFuture().sync();} catch (InterruptedException e) { e.printStackTrace();} finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully();}

按我的理解简单解释下吧,就是先配置启动类,然后绑定并监听端口,最后监听关闭事件,具体细节我们慢慢来看。

配置

先看下配置启动类,这个就是比较流行的链式方法,其实很简单,return this就行了

clipboard.png

我们再来看下channel的配置项

clipboard.png

实际上是实现了一个channelFactory接口的工厂类,这个就是经典的工厂设计模式

clipboard.png

我们可以有不同的实现方式,netty这里默认的是用的反射工厂类,然而当我尝试找其他工厂的实现,很遗憾没有发现。

泛型

看到这里,我是对这些方法的签名有些奇怪,为什么要用泛型来实现呢

clipboard.png

其实是netty有多个启动类,我们这个是服务端启动类serverBootstrap,还有客户端的Bootstrap,这两个都继承了一个抽象类abstractBootstrap,那两个类的一些公用的方法,是写在抽象父类中的,就拿这个配置方法来说,如果直接在父类中return this,那返回的还是父类,会有些方法的损失,所以这里用泛型来实现类,可以直接在父类中转为子类再return

clipboard.png

最后看下这个抽象类的签名吧,我觉得可以学习学习,还是挺优雅的

clipboard.png

Next

这次就看到这里,下一节我们看一下启动类里的成员的类型和它们的大概的作用,然后动手实现我们自己的一个简单的启动类。

转载地址:http://tmjbx.baihongyu.com/

你可能感兴趣的文章
Spark API编程动手实战-07-join操作深入实战
查看>>
Spring ’14 Wave Update: Installing Dynamics CRM on Tablets for Windows 8.1
查看>>
MySQL 备份与恢复
查看>>
TEST
查看>>
PAT A1037
查看>>
(六)Oracle学习笔记—— 约束
查看>>
[Oracle]如何在Oracle中设置Event
查看>>
top.location.href和localtion.href有什么不同
查看>>
02-创建hibernate工程
查看>>
Scrum之 Sprint计划会议
查看>>
svn命令在linux下的使用
查看>>
Gradle之module间依赖版本同步
查看>>
java springcloud版b2b2c社交电商spring cloud分布式微服务(十五)Springboot整合RabbitMQ...
查看>>
10g手动创建数据库
查看>>
Windwos Server 2008 R2 DHCP服务
查看>>
UVa 11292 勇者斗恶龙(The Dragon of Loowater)
查看>>
白话算法(7) 生成全排列的几种思路(二) 康托展开
查看>>
d3 v4实现饼状图,折线标注
查看>>
微软的云策略
查看>>
Valid Parentheses
查看>>