摘要:一些想法这个系列想开很久了,自己使用也有一段时间了,利用也编写了一个简单的框架,并运用到工作中了,感觉还不错,趁着这段时间工作不是很忙,来分析一波源码,提升下技术硬实力。
一些想法
这个系列想开很久了,自己使用netty也有一段时间了,利用netty也编写了一个简单的框架,并运用到工作中了,感觉还不错,趁着这段时间工作不是很忙,来分析一波源码,提升下技术硬实力。
结构这里先看下netty包的目录结构
由名字来做个大概的推测吧:
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就行了
我们再来看下channel的配置项
实际上是实现了一个channelFactory接口的工厂类,这个就是经典的工厂设计模式
我们可以有不同的实现方式,netty这里默认的是用的反射工厂类,然而当我尝试找其他工厂的实现,很遗憾没有发现。
泛型看到这里,我是对这些方法的签名有些奇怪,为什么要用泛型来实现呢
其实是netty有多个启动类,我们这个是服务端启动类serverBootstrap,还有客户端的Bootstrap,这两个都继承了一个抽象类abstractBootstrap,那两个类的一些公用的方法,是写在抽象父类中的,就拿这个配置方法来说,如果直接在父类中return this,那返回的还是父类,会有些方法的损失,所以这里用泛型来实现类,可以直接在父类中转为子类再return
最后看下这个抽象类的签名吧,我觉得可以学习学习,还是挺优雅的
Next这次就看到这里,下一节我们看一下启动类里的成员的类型和它们的大概的作用,然后动手实现我们自己的一个简单的启动类。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70514.html
摘要:下面无耻的贴点源码。启动类我们也学,把启动类抽象成两层,方便以后写客户端。别着急,我们慢慢来,下一篇我们会了解以及他的成员,然后,完善我们的程序,增加其接收数据的能力。文章的源码我会同步更新到我的上,欢迎大家,哈哈。 废话两句 这次更新拖了很长时间,第一是自己生病了,第二是因为最开始这篇想写的很大,然后构思了很久,发现不太合适把很多东西写在一起,所以做了点拆分,准备国庆前完成这篇博客。...
摘要:我想这很好的解释了中,仅仅一个都这么复杂,在单线程或者说串行的程序中,编程往往是很简单的,说白了就是调用,调用,调用然后返回。 Netty源码分析(三) 前提概要 这次停更很久了,原因是中途迷茫了一段时间,不过最近调整过来了。不过有点要说下,前几天和业内某个大佬聊天,收获很多,所以这篇博文和之前也会不太一样,我们会先从如果是我自己去实现这个功能需要怎么做开始,然后去看netty源码,与...
摘要:今天是小明女朋友的生日,小明想给她一个惊喜,于是想到了订一个蛋糕给她,所以小明打电话给蛋糕店预定,店员回复他说好的,我们知道了,制作好了会通知你的。于是小明就开开心心的打游戏去了。值检查,整个设计中均没有对对象做的检查,容易引起。 Netty中的异步调用 如果大家观察仔细,会发现我们之前所写的代码都是串行执行的,这是什么意思?就是我们看到代码是什么顺序,最后程序就是按什么顺序执行的。 ...
摘要:而用于主线程池的属性都定义在中本篇只是简单介绍了一下引导类的配置属性,下一篇我将详细介绍服务端引导类的过程分析。 从Java1.4开始, Java引入了non-blocking IO,简称NIO。NIO与传统socket最大的不同就是引入了Channel和多路复用selector的概念。传统的socket是基于stream的,它是单向的,有InputStream表示read和Outpu...
摘要:对于,目前大家只知道是个线程组,其内部到底如何实现的,它的作用到底是什么,大家也都不太清楚,由于篇幅原因,这里不作详细介绍,后面会有文章作专门详解。 在上一篇《ServerBootstrap 与 Bootstrap 初探》中,我们已经初步的了解了ServerBootstrap是netty进行服务端开发的引导类。 且在上一篇的服务端示例中,我们也看到了,在使用netty进行网络编程时,我...
阅读 3761·2021-11-25 09:43
阅读 2193·2021-11-23 10:13
阅读 825·2021-11-16 11:44
阅读 2370·2019-08-29 17:24
阅读 1386·2019-08-29 17:17
阅读 3483·2019-08-29 11:30
阅读 2586·2019-08-26 13:23
阅读 2346·2019-08-26 12:10