AbstractBootstrap的研读
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对象。
privatevolatileEventLoopGroup group;
privatevolatileChannelFactory channelFactory;
privatevolatileSocketAddress localAddress;
private final Map,Object> options =newLinkedHashMap,Object>();
private final Map,Object> attrs =newLinkedHashMap,Object>();
privatevolatileChannelHandler handler;
AbstractBootstrap还有一个重要方法doBind(),为什么这个方法会在父类实现而不是在ServerBootstrap中实现,注解里面写了bind()方法不仅可以在ServerBootstrap中绑定一个端口用于监听,也可以用在BootStrap中用于无连接的数据传输。这里主要调用Channel的bind方法。因为netty中多有的操作都是异步的。所以所有IOC操作都返回future的子类。然后判断是否OK,有时间写一篇该文章。
Bootstrap
客户端的帮助类,用来配置启动一个channel,该类有2个主要方法,一个init用于初始化通道,一个是doConnect(),这里面会生成一个客户端的Channel。
privateChannelFuture doConnect(finalSocketAddress remoteAddress,finalSocketAddress localAddress){
finalChannelFuture regFuture = initAndRegister();
finalChannel channel = regFuture.channel();
if(regFuture.cause()!=null){
return regFuture;
}
finalChannelPromise promise = channel.newPromise();
if(regFuture.isDone()){
doConnect0(regFuture, channel, remoteAddress, localAddress, promise);
}else{
regFuture.addListener(newChannelFutureListener(){
@Override
publicvoid operationComplete(ChannelFuture future)throwsException{
doConnect0(regFuture, channel, remoteAddress, localAddress, promise);
}
});
}
return promise;
}
EventLoopGroup group =newNioEventLoopGroup();
try{
Bootstrap b =newBootstrap();
b.group(group)
.channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAY,true)
.handler(newChannelInitializer<SocketChannel>(){
@Override
publicvoid initChannel(SocketChannel ch)throwsException{
ChannelPipeline p = ch.pipeline();
if(sslCtx !=null){
p.addLast(sslCtx.newHandler(ch.alloc(), HOST, PORT));
}
//p.addLast(new LoggingHandler(LogLevel.INFO));
p.addLast(newEchoClientHandler());
}
});
// Start the client.
ChannelFuture f = b.connect(HOST, PORT).sync();//
// Wait until the connection is closed.
f.channel().closeFuture().sync();
}finally{
// Shut down the event loop to terminate all threads.
group.shutdownGracefully();
}
privatefinalMap<ChannelOption<?>,Object> childOptions =newLinkedHashMap<ChannelOption<?>,Object>();
privatefinalMap<AttributeKey<?>,Object> childAttrs =newLinkedHashMap<AttributeKey<?>,Object>();
privatevolatileEventLoopGroup childGroup;
privatevolatileChannelHandler childHandler;
p.addLast(newChannelInitializer<Channel>(){//当有Channel连接该监听端口是调用该
@Override
publicvoid initChannel(Channel ch)throwsException{
ch.pipeline().addLast(newServerBootstrapAcceptor(
currentChildGroup, currentChildHandler, currentChildOptions, currentChildAttrs));
}
});
EventLoopGroup bossGroup =newNioEventLoopGroup(1);
EventLoopGroup workerGroup =newNioEventLoopGroup();
try{
ServerBootstrap b =newServerBootstrap();
b.group(bossGroup, workerGroup)
/**
* 设置服务端的Channel,Netty通过Channel工厂类创建不同的Channel,对于服务端,
* Netty需要创建NioServerSocketChannel,
*/
.channel(NioServerSocketChannel.class)
/**
* 设置TCP的参数,这里设置了套接字的最大连接个数。
*/
.option(ChannelOption.SO_BACKLOG,100)
/**
* 设置父类的Handler,父类的handler是客户端新接入的接连SocketChannel对应的ChannelPipeline
* 的handler
*/
.handler(newLoggingHandler(LogLevel.INFO))
/**
* 子类的Hanlder是NioServerSockerChannel对应的ChannelPipeline的Handler
*/
/**
* 区别:ServerBootstrap中的handler是NioServerSocketChannel使用
* 所有连接该监听端口的客户端都会执行它,父类的AbstractBootstrap中的Handler
* 是个工厂类,他为没有新接入的客户端都创建一个新的Handler
*/
.childHandler(newChannelInitializer<SocketChannel>(){
@Override
publicvoid initChannel(SocketChannel ch)throwsException{
ChannelPipeline p = ch.pipeline();
if(sslCtx !=null){
p.addLast(sslCtx.newHandler(ch.alloc()));
}
//p.addLast(new LoggingHandler(LogLevel.INFO));
p.addLast(newEchoServerHandler());
}
});
/**
*每个channel绑定一个ChannelPipeline,一个ChannelPipeline里面添加了很多handler
*/
// Start the server.
ChannelFuture f = b.bind(PORT).sync();
// Wait until the server socket is closed.
f.channel().closeFuture().sync();
}finally{
// Shut down all event loops to terminate all threads.
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
AbstractBootstrap的研读的更多相关文章
- 转:研读代码必须掌握的Eclipse快捷键
总结的很不错,而且有相应的用法,推荐!!! from: http://www.cnblogs.com/yanyansha/archive/2011/08/30/2159265.html 研读代码必须掌 ...
- iOS组件化思路-大神博客研读和思考
一.大神博客研读 随着应用需求逐步迭代,应用的代码体积将会越来越大,为了更好的管理应用工程,我们开始借助CocoaPods版本管理工具对原有应用工程进行拆分.但是仅仅完成代码拆分还不足以解决业务之间的 ...
- Automatic Generation of Animated GIFs from Video论文研读及实现
论文地址:Video2GIF: Automatic Generation of Animated GIFs from Video 视频的结构化分析是视频理解相关工作的关键.虽然本文是生成gif图,但是 ...
- 【Netty】(4)—源码AbstractBootstrap
源码AbstractBootstrap 一.概念 AbstractBootstrap是一个工具类,用于服务器通道的一系列配置,绑定NioEventLoopGroup线程组,指定指定NIO的模式,指定子 ...
- AD预测论文研读系列2
EARLY PREDICTION OF ALZHEIMER'S DISEASE DEMENTIA BASED ON BASELINE HIPPOCAMPAL MRI AND 1-YEAR FOLLOW ...
- AD预测论文研读系列1
A Deep Learning Model to Predict a Diagnosis of Alzheimer Disease by Using 18F-FDG PET of the Brain ...
- QA系统Match-LSTM代码研读
QA系统Match-LSTM代码研读 背景 在QA模型中,Match-LSTM是较早提出的,使用Prt-Net边界模型.本文是对阅读其实现代码的总结.主要思路是对照着论文和代码,对论文中模型的关键结构 ...
- GoogLeNetv4 论文研读笔记
Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning 原文链接 摘要 向传统体系结构中引入 ...
- GoogLeNetv3 论文研读笔记
Rethinking the Inception Architecture for Computer Vision 原文链接 摘要 卷积网络是目前最新的计算机视觉解决方案的核心,对于大多数任务而言,虽 ...
随机推荐
- php mysql 查询
抓取结果集对象中数据并且转换数组 $row = mysqli_fetch_assoc(结果集对象); 从结果集对象中抓取一行记录->转换关联数组 $row = mysqli_fetch_row( ...
- freemarker实现第一个HelloWorld
第一步:引入freemarker jar包 第二步:创建templates下的test01.ftl 第三步:在web.xml下 第四步:编写后台代码 package com.wisezone.test ...
- RabbitMQ入门Demo
之前环境安装已经介绍过了,下面直接跑个Demo. 1.添加Maven依赖 <dependency> <groupId>org.springframework.amqp</ ...
- Oracle记录(一)Oracle简介与安装
Oracle笔记(一) Oracle简介及安装 一.轨迹 二.Oracle简介 Oracle是现在全世界最大的数据库提供商,编程语言提供商,应用软件提供商,它的地位等价于微软的地位. Oracle在古 ...
- bae3.0第一步 添加框架支持
1.克隆bae上应用代码: 先在本地linux机器上创建文件夹bae并进入, 再执行git clone https://git.duapp.com/appidd01iud80bg 结果会在bae文件夹 ...
- 断路器(CircuitBreaker)设计模式
断路器是电器时代的一个重要组成部分,后面总是有保险丝熔断或跳闸的断路器是安全的重要保障. 微服务最近几年成为软件架构的热门话题,其益处多多.但需要知道的是,一旦开始将单块系统进行分解,就上了分布式系统 ...
- 第十四届华中科技大学程序设计竞赛决赛同步赛 F Beautiful Land(01背包,背包体积超大时)
链接:https://www.nowcoder.com/acm/contest/119/F来源:牛客网 Beautiful Land 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1 ...
- Nor Flash的CFI与JEDEC接口
Flash 存储器接口还有两个标准:CFI和JEDEC.CFI为公共Flash接口[Common Flash Interface],用来帮助程序从Flash芯片中获取操作方式信息(发送命令,从nor ...
- Task用法(2)-任务等待wait
1.Wait 用法 默认情况下,Task 是有线程池中的异步线程执行,是否执行完成,可以通过Task的的属性IsCompleted 来判断, 如果想在子线程工作完成之后,在进行后续主线程工作可以 ...
- 基于Flask框架的Python web程序的开发实战 <二> 项目组织结构
看到第七章-大型程序的结构,备受打击,搞不清工厂函数.蓝本.单元测试,不理解这些对象/变量怎么传递的,感觉好乱,虽然按照源码都照抄了,还是不理解.... 缓缓先.... 本来网上的Flask的教程就比 ...