AbstractBootstrap是一个工具类,用来配置和启动Channel的,下面看下AbstractBootstrap的类继承,ServerBootstrap用于启动ServerChannel的,是服务端的工具类,Bootstrap是用于启动Channel,是客户端的工具类,bind用于udp等无连接的传输,bind用于有连接的传输。

  AbstractBootstrap

  该类用来配置启动一个Channel,那么配置启动一个Channel需要那些条件?首先需要一个Channel,AbstractBootstrap提供了一个ChannelFactory对象用来创建Channel,一个Channel会对应一个EventLoop用于IO的事件处理,在Channel的整个生命周期中会绑定一个EventLoop,这里可理解给Channel分配一个线程进行IO事件处理,结束后回收该线程,但是AbstractBootstrap没有提供EventLoop而是提供了一个EventLoopGroup,EventLoop继承EventLoopGroup,在某些情况下可以把EventLoopGroup当EventLoop来用,EventLoopGroup中包含多个Eventloop,当一个连接到达,Netty会注册一个Channel,然后EventLoopGroup会分配一个EventLoop绑定到这个channel。不管是服务器还是客户端的Channel都需要绑定一个本地端口这就有了SocketAddress类的对象localAddress,Channel有很多选项所有有了options对象LinkedHashMap<channeloption<?>, Object>。怎么处理Channel的IO事件呢,我们添加一个事件处理器ChannelHandler对象。

  1.   privatevolatileEventLoopGroup group;
  2.   privatevolatileChannelFactory channelFactory;
  3.   privatevolatileSocketAddress localAddress;
  4.   private final Map,Object> options =newLinkedHashMap,Object>();
  5.   private final Map,Object> attrs =newLinkedHashMap,Object>();
  6.   privatevolatileChannelHandler handler;

  AbstractBootstrap还有一个重要方法doBind(),为什么这个方法会在父类实现而不是在ServerBootstrap中实现,注解里面写了bind()方法不仅可以在ServerBootstrap中绑定一个端口用于监听,也可以用在BootStrap中用于无连接的数据传输。这里主要调用Channel的bind方法。因为netty中多有的操作都是异步的。所以所有IOC操作都返回future的子类。然后判断是否OK,有时间写一篇该文章。

Bootstrap

客户端的帮助类,用来配置启动一个channel,该类有2个主要方法,一个init用于初始化通道,一个是doConnect(),这里面会生成一个客户端的Channel。

  1. privateChannelFuture doConnect(finalSocketAddress remoteAddress,finalSocketAddress localAddress){
  2. finalChannelFuture regFuture = initAndRegister();
  3. finalChannel channel = regFuture.channel();
  4. if(regFuture.cause()!=null){
  5. return regFuture;
  6. }
  7. finalChannelPromise promise = channel.newPromise();
  8. if(regFuture.isDone()){
  9. doConnect0(regFuture, channel, remoteAddress, localAddress, promise);
  10. }else{
  11. regFuture.addListener(newChannelFutureListener(){
  12. @Override
  13. publicvoid operationComplete(ChannelFuture future)throwsException{
  14. doConnect0(regFuture, channel, remoteAddress, localAddress, promise);
  15. }
  16. });
  17. }
  18. return promise;
  19. }
下面看下Bootstrap的使用
  1. EventLoopGroup group =newNioEventLoopGroup();
  2. try{
  3. Bootstrap b =newBootstrap();
  4. b.group(group)
  5. .channel(NioSocketChannel.class)
  6. .option(ChannelOption.TCP_NODELAY,true)
  7. .handler(newChannelInitializer<SocketChannel>(){
  8. @Override
  9. publicvoid initChannel(SocketChannel ch)throwsException{
  10. ChannelPipeline p = ch.pipeline();
  11. if(sslCtx !=null){
  12. p.addLast(sslCtx.newHandler(ch.alloc(), HOST, PORT));
  13. }
  14. //p.addLast(new LoggingHandler(LogLevel.INFO));
  15. p.addLast(newEchoClientHandler());
  16. }
  17. });
  18. // Start the client.
  19. ChannelFuture f = b.connect(HOST, PORT).sync();//
  20. // Wait until the connection is closed.
  21. f.channel().closeFuture().sync();
  22. }finally{
  23. // Shut down the event loop to terminate all threads.
  24. group.shutdownGracefully();
  25. }
ServerBootstrap:
这个用于配置和启动服务端的Channel,该类添加了几个新的成员属性:
  1. privatefinalMap<ChannelOption<?>,Object> childOptions =newLinkedHashMap<ChannelOption<?>,Object>();
  2. privatefinalMap<AttributeKey<?>,Object> childAttrs =newLinkedHashMap<AttributeKey<?>,Object>();
  3. privatevolatileEventLoopGroup childGroup;
  4. privatevolatileChannelHandler childHandler;
这里有必要提下Java的Reactor模式,如下图所示,当然netty对下图的架构进行了修改:一个subReactor一个线程。后面细说。
当一个请求来的时候,group接受该请求后,把客户端的Channel传递到childGroup来出来,这样就提供了业务处理能力,group大致对应mainReactor,childGroup对应subReactor和ThreadPool。  因为EventLoopGroup本质就是一个线程池。
  1. p.addLast(newChannelInitializer<Channel>(){//当有Channel连接该监听端口是调用该
  2. @Override
  3. publicvoid initChannel(Channel ch)throwsException{
  4. ch.pipeline().addLast(newServerBootstrapAcceptor(
  5. currentChildGroup, currentChildHandler, currentChildOptions, currentChildAttrs));
  6. }
  7. });
仔细看这块代码。主Channel把IO事件派发给子Channel.看下他的使用吧:
  1. EventLoopGroup bossGroup =newNioEventLoopGroup(1);
  2. EventLoopGroup workerGroup =newNioEventLoopGroup();
  3. try{
  4. ServerBootstrap b =newServerBootstrap();
  5. b.group(bossGroup, workerGroup)
  6. /**
  7. * 设置服务端的Channel,Netty通过Channel工厂类创建不同的Channel,对于服务端,
  8. * Netty需要创建NioServerSocketChannel,
  9. */
  10. .channel(NioServerSocketChannel.class)
  11. /**
  12. * 设置TCP的参数,这里设置了套接字的最大连接个数。
  13. */
  14. .option(ChannelOption.SO_BACKLOG,100)
  15. /**
  16. * 设置父类的Handler,父类的handler是客户端新接入的接连SocketChannel对应的ChannelPipeline
  17. * 的handler
  18. */
  19. .handler(newLoggingHandler(LogLevel.INFO))
  20. /**
  21. * 子类的Hanlder是NioServerSockerChannel对应的ChannelPipeline的Handler
  22. */
  23. /**
  24. * 区别:ServerBootstrap中的handler是NioServerSocketChannel使用
  25. * 所有连接该监听端口的客户端都会执行它,父类的AbstractBootstrap中的Handler
  26. * 是个工厂类,他为没有新接入的客户端都创建一个新的Handler
  27. */
  28. .childHandler(newChannelInitializer<SocketChannel>(){
  29. @Override
  30. publicvoid initChannel(SocketChannel ch)throwsException{
  31. ChannelPipeline p = ch.pipeline();
  32. if(sslCtx !=null){
  33. p.addLast(sslCtx.newHandler(ch.alloc()));
  34. }
  35. //p.addLast(new LoggingHandler(LogLevel.INFO));
  36. p.addLast(newEchoServerHandler());
  37. }
  38. });
  39. /**
  40. *每个channel绑定一个ChannelPipeline,一个ChannelPipeline里面添加了很多handler
  41. */
  42. // Start the server.
  43. ChannelFuture f = b.bind(PORT).sync();
  44. // Wait until the server socket is closed.
  45. f.channel().closeFuture().sync();
  46. }finally{
  47. // Shut down all event loops to terminate all threads.
  48. bossGroup.shutdownGracefully();
  49. workerGroup.shutdownGracefully();
  50. }
 
 
 
下面讲下异步处理的Future等东西。
 

AbstractBootstrap的研读的更多相关文章

  1. 转:研读代码必须掌握的Eclipse快捷键

    总结的很不错,而且有相应的用法,推荐!!! from: http://www.cnblogs.com/yanyansha/archive/2011/08/30/2159265.html 研读代码必须掌 ...

  2. iOS组件化思路-大神博客研读和思考

    一.大神博客研读 随着应用需求逐步迭代,应用的代码体积将会越来越大,为了更好的管理应用工程,我们开始借助CocoaPods版本管理工具对原有应用工程进行拆分.但是仅仅完成代码拆分还不足以解决业务之间的 ...

  3. Automatic Generation of Animated GIFs from Video论文研读及实现

    论文地址:Video2GIF: Automatic Generation of Animated GIFs from Video 视频的结构化分析是视频理解相关工作的关键.虽然本文是生成gif图,但是 ...

  4. 【Netty】(4)—源码AbstractBootstrap

    源码AbstractBootstrap 一.概念 AbstractBootstrap是一个工具类,用于服务器通道的一系列配置,绑定NioEventLoopGroup线程组,指定指定NIO的模式,指定子 ...

  5. AD预测论文研读系列2

    EARLY PREDICTION OF ALZHEIMER'S DISEASE DEMENTIA BASED ON BASELINE HIPPOCAMPAL MRI AND 1-YEAR FOLLOW ...

  6. AD预测论文研读系列1

    A Deep Learning Model to Predict a Diagnosis of Alzheimer Disease by Using 18F-FDG PET of the Brain ...

  7. QA系统Match-LSTM代码研读

    QA系统Match-LSTM代码研读 背景 在QA模型中,Match-LSTM是较早提出的,使用Prt-Net边界模型.本文是对阅读其实现代码的总结.主要思路是对照着论文和代码,对论文中模型的关键结构 ...

  8. GoogLeNetv4 论文研读笔记

    Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning 原文链接 摘要 向传统体系结构中引入 ...

  9. GoogLeNetv3 论文研读笔记

    Rethinking the Inception Architecture for Computer Vision 原文链接 摘要 卷积网络是目前最新的计算机视觉解决方案的核心,对于大多数任务而言,虽 ...

随机推荐

  1. 深入探索C++对象模型 读书笔记

    第1章 关于对象 1.C++在布局以及存取时间上的主要的额外负担是由virtual引起的,包括: a.virtual function机制,引入vptr以及vtbl,支持一个有效率的"执行期 ...

  2. HDFS超租约异常总结(org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException)

    HDFS超租约异常总结(org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException) 转载 2014年02月22日 14:40:58 96 ...

  3. 畅通工程再续 (kruskal算法的延续)

    个人心得:这题其实跟上一题没什么区别,自己想办法把坐标啥的都给转换为对应的图形模样就好了 相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实 ...

  4. webpack入门(四)——webpack loader 和plugin

    什么是loader loaders是你用在app源码上的转换元件.他们是用node.js运行的,把源文件作为参数,返回新的资源的函数. 例如,你可以用loaders告诉webpack加载 coffee ...

  5. webpack学习(一)—— 入门

    ,我们通常采用的是组件化开发方式,这样就会对应有很多个js文件,而打包工具的出现则是为了正确处理这些js文件的依赖关系,并生成一个最终的文件,这样,我们最后只需要加载打包以后的文件就可以了,而无须加载 ...

  6. 了解Unity中的多线程及使用多线程

    http://blog.csdn.net/hany3000/article/details/16917571 如果你想在游戏中使用多线程,你应该看看这篇文章,线程是一个相当复杂的话题,但如果你掌握了它 ...

  7. 手机访问PC网站自动跳转到手机网站代码(转)

    4G时代,手机网站已经非常普遍了,一般手机网站都有一个二级域名来访问,比如 m.16css.com 如果手机直接访问www.16css.com 就是PC网站,在手机上浏览电脑版网站体验非常不好. 如果 ...

  8. BZOJ3745:[COCI2015]Norma

    浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...

  9. Spring MVC 项目示例

    Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架.Spring的web框架围绕DispatcherServlet设计, 作用是将请求分发到不同 ...

  10. java代码实现通讯录实例,我不知道这有什么用。,

    运行显示: Friend:zl,Address:武大樱花美Colleagues:蔡依林,Department:麻城市人民政府 题目: 1.任务描述 完善上面通讯录名片的例子. 2.技能要点 掌握类继承 ...