当前位置: 首页 > news >正文

网站风格和功能设计方案站长工具的使用seo综合查询排名

网站风格和功能设计方案,站长工具的使用seo综合查询排名,全景网站制作教程,企业级网站开发平台前言:已经初始化了NioEventLoopGroup 的boosGroup 和 workerGroup ,那么ServerBootstrap的作用是干嘛的呢 ,本文在Spring架构篇–2.7.1 远程通信基础–Netty原理–NioEventLoopGroup 之后继续进行探究 1 首先回顾下 nettt 的使用demo&#x…

前言:已经初始化了NioEventLoopGroup 的boosGroup 和 workerGroup ,那么ServerBootstrap的作用是干嘛的呢 ,本文在Spring架构篇–2.7.1 远程通信基础–Netty原理–NioEventLoopGroup 之后继续进行探究

1 首先回顾下 nettt 的使用demo:

public class DiscardServer {private int port;public DiscardServer(int port) {this.port = port;}public static void main(String[] args) {new DiscardServer(8080).run();}private void run() {NioEventLoopGroup boss = new NioEventLoopGroup();NioEventLoopGroup worker = new NioEventLoopGroup();try {ServerBootstrap server = new ServerBootstrap();server.group(boss,worker).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new DiscardServerHandler());}}).option(ChannelOption.SO_BACKLOG,128).childOption(ChannelOption.SO_KEEPALIVE,true);ChannelFuture f = server.bind(this.port).sync();System.out.println("8080服务已启动");f.channel().closeFuture().sync();} catch (InterruptedException e) {e.printStackTrace();} finally {boss.shutdownGracefully();worker.shutdownGracefully();}}
}

可以看到ServerBootstrap 的对象做了一系列的配置后最终 通过 bind(this.port).sync() 进行启动;

2 ServerBootstrap 类:

2.1 new ServerBootstrap() 工作内容:

public class ServerBootstrap extends AbstractBootstrap<ServerBootstrap, ServerChannel>private static final InternalLogger logger = InternalLoggerFactory.getInstance(ServerBootstrap.class);
private final Map<ChannelOption<?>, Object> childOptions = new LinkedHashMap();
private final Map<AttributeKey<?>, Object> childAttrs = new ConcurrentHashMap();
// ServerBootstrap 对象赋值给 config
private final ServerBootstrapConfig config = new ServerBootstrapConfig(this);
private volatile EventLoopGroup childGroup;
private volatile ChannelHandler childHandler;public ServerBootstrap() {
}

AbstractBootstrap 类

public abstract class AbstractBootstrap<B extends AbstractBootstrap<B, C>, C extends Channel> implements Cloneable {static final Map.Entry<ChannelOption<?>, Object>[] EMPTY_OPTION_ARRAY = new Map.Entry[0];static final Map.Entry<AttributeKey<?>, Object>[] EMPTY_ATTRIBUTE_ARRAY = new Map.Entry[0];volatile EventLoopGroup group;private volatile ChannelFactory<? extends C> channelFactory;private volatile SocketAddress localAddress;private final Map<ChannelOption<?>, Object> options = new LinkedHashMap();private final Map<AttributeKey<?>, Object> attrs = new ConcurrentHashMap();private volatile ChannelHandler handler;AbstractBootstrap() {}}
  • 可以看到ServerBootstrap 继承了AbstractBootstrap类,当new ServerBootstrap() 时,对ServerBootstrap和AbstractBootstrap类都通过无参的构造方法,完成了这两个类的对象实例化;
  • 可以看到ServerBootstrap和AbstractBootstrap这两个类的属性非常相似,实际上 ServerBootstrap 用来放NioEventLoopGroup 工作线程的数据;AbstractBootstrap 用来放 boss 线程的数据;
  • 可以看到这里只是进行了初始化,里面的属性都还没有进行赋值,两个对象的属性值都是默认值;

2.2 ServerBootstrap ,AbstractBootstrap 的属性赋值:

2.2.1 server.group(boss,worker):完成对父类和子类 NioEventLoopGroup对象进行赋值
ServerBootstrap 类的 group 方法:

public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) {
// 父类AbstractBootstrap  的EventLoopGroup  赋值super.group(parentGroup);if (this.childGroup != null) {throw new IllegalStateException("childGroup set already");} else {
// 子类的EventLoopGroup   volatile EventLoopGroup group 赋值;this.childGroup = (EventLoopGroup)ObjectUtil.checkNotNull(childGroup, "childGroup");return this;}
}

super.group(parentGroup); 父类对象的赋值:
AbstractBootstrap 的group 方法:

static final Map.Entry<ChannelOption<?>, Object>[] EMPTY_OPTION_ARRAY = new Map.Entry[0];
static final Map.Entry<AttributeKey<?>, Object>[] EMPTY_ATTRIBUTE_ARRAY = new Map.Entry[0];
volatile EventLoopGroup group;
private volatile ChannelFactory<? extends C> channelFactory;
private volatile SocketAddress localAddress;
private final Map<ChannelOption<?>, Object> options = new LinkedHashMap();
private final Map<AttributeKey<?>, Object> attrs = new ConcurrentHashMap();
private volatile ChannelHandler handler;AbstractBootstrap() {
}
// 父类的EventLoopGroup  赋值
AbstractBootstrap(AbstractBootstrap<B, C> bootstrap) {this.group = bootstrap.group;this.channelFactory = bootstrap.channelFactory;this.handler = bootstrap.handler;this.localAddress = bootstrap.localAddress;synchronized(bootstrap.options) {this.options.putAll(bootstrap.options);}this.attrs.putAll(bootstrap.attrs);
}
// 父类group  AbstractBootstrap  类 对象的赋值 volatile EventLoopGroup group;
public B group(EventLoopGroup group) {ObjectUtil.checkNotNull(group, "group");if (this.group != null) {throw new IllegalStateException("group set already");} else {this.group = group;return this.self();}
}

2.2.2 channel(NioServerSocketChannel.class):
AbstractBootstrap 类 private volatile ChannelFactory<? extends C> channelFactory; 对象赋值
调用 AbstractBootstrap 类中 channel(NioServerSocketChannel.class) 方法:

public B channel(Class<? extends C> channelClass) {
//  先使用ReflectiveChannelFactory 反射工厂类,对传入的channel 进行包装
// 调用channelFactory 对父类AbstractBootstrap 对象channel 工厂进行初始化return this.channelFactory((io.netty.channel.ChannelFactory)(new ReflectiveChannelFactory((Class)ObjectUtil.checkNotNull(channelClass, "channelClass"))));
}
// 工厂方法调用
public B channelFactory(io.netty.channel.ChannelFactory<? extends C> channelFactory) {return this.channelFactory((ChannelFactory)channelFactory);
}
// AbstractBootstrap 对象属性的初始化@Deprecated
public B channelFactory(ChannelFactory<? extends C> channelFactory) {ObjectUtil.checkNotNull(channelFactory, "channelFactory");if (this.channelFactory != null) {throw new IllegalStateException("channelFactory set already");} else {this.channelFactory = channelFactory;return this.self();}
}
// channel类反射工厂的创建
public class ReflectiveChannelFactory<T extends Channel> implements ChannelFactory<T> {private final Constructor<? extends T> constructor;public ReflectiveChannelFactory(Class<? extends T> clazz) {ObjectUtil.checkNotNull(clazz, "clazz");try {// 赋值 NioServerSocketChannel 类的构造器,使得在需要实例化channel 对象的时候// 可以通过改channel 的无参构造方法完成对象实例化this.constructor = clazz.getConstructor();} catch (NoSuchMethodException var3) {throw new IllegalArgumentException("Class " + StringUtil.simpleClassName(clazz) + " does not have a public non-arg constructor", var3);}}// 对当前的channel 通过反射调用channel 对象的无参构造方法public T newChannel() {try {return (Channel)this.constructor.newInstance();} catch (Throwable var2) {throw new ChannelException("Unable to create Channel from class " + this.constructor.getDeclaringClass(), var2);}}public String toString() {return StringUtil.simpleClassName(ReflectiveChannelFactory.class) + '(' + StringUtil.simpleClassName(this.constructor.getDeclaringClass()) + ".class)";}
}
  • 通过channle 方法可以看到,完成了对父类AbstractBootstrap 对象 channel 工厂的属性初始化;
  • 在真正需要NioServerSocketChannel 对象的时候,可以通过ReflectiveChannelFactory的 newChannel() 方法完成对 NioServerSocketChannel 无参的构造方法调用,从而实例化一个NioServerSocketChannel的对象出来;

2.2.3 childHandler(new ChannelInitializer() { }):
调用ServerBootstrap 类中 childHandler(ChannelHandler childHandler) 方法:

public ServerBootstrap childHandler(ChannelHandler childHandler) {this.childHandler = (ChannelHandler)ObjectUtil.checkNotNull(childHandler, "childHandler");return this;
}

对ServerBootstrap 事件处理属性private volatile ChannelHandler childHandler; 赋值;

2.2.4 option(ChannelOption.SO_BACKLOG,128):
AbstractBootstrap 的option 方法,对父类AbstractBootstrap 对象options 顺序赋值:

// private final Map<ChannelOption<?>, Object> options = new LinkedHashMap(); 属性赋值
public <T> B option(ChannelOption<T> option, T value) {ObjectUtil.checkNotNull(option, "option");synchronized(this.options) {if (value == null) {this.options.remove(option);} else {this.options.put(option, value);}}return this.self();
}

2.2.5 childOption(ChannelOption.SO_KEEPALIVE,true):
ServerBootstrap 类中的childOption 方法:

// private final Map<ChannelOption<?>, Object> childOptions = new LinkedHashMap(); 赋值
public <T> ServerBootstrap childOption(ChannelOption<T> childOption, T value) {ObjectUtil.checkNotNull(childOption, "childOption");synchronized(this.childOptions) {if (value == null) {this.childOptions.remove(childOption);} else {this.childOptions.put(childOption, value);}return this;}
}
  • 可以看到上面的这些步骤先是对ServerBootstrap 和AbstractBootstrap 对象实例化 然后为其属性进行赋值操作;
  • 将NioEventLoopGroup worker = new NioEventLoopGroup(); 的worker 对象对其ServerBootstrap 的EventLoopGroup childGroup 赋值;然后将 NioEventLoopGroup boss = new NioEventLoopGroup(); 对象对其AbstractBootstrap 的 volatile EventLoopGroup group 属性赋值;
  • 对AbstractBootstrap 的channel 工厂类属性 private volatile ChannelFactory<? extends C> channelFactory; 赋值为NioServerSocketChannel 对象工厂;
  • 对AbstractBootstrap 的options 属性赋值key:ChannelOption.SO_BACKLOG, value :128;
  • 对ServerBootstrap 的childOptions 属性赋值key:ChannelOption.SO_KEEPALIVE, value: true;

以上步骤都是初始化和赋值操作,没有socket 端口的绑定,以及时间监听的处理,那么这些处理就只剩在bind(this.port).sync() 进行处理,由于bind 方法嵌套较深,所有放在下一篇继续探究;


文章转载自:
http://prolamine.xkzr.cn
http://sutton.xkzr.cn
http://portiere.xkzr.cn
http://beppu.xkzr.cn
http://palmistry.xkzr.cn
http://numbness.xkzr.cn
http://lyssophobia.xkzr.cn
http://banjax.xkzr.cn
http://bookish.xkzr.cn
http://sudsy.xkzr.cn
http://bon.xkzr.cn
http://pygmyism.xkzr.cn
http://responsion.xkzr.cn
http://heliometer.xkzr.cn
http://necroscopy.xkzr.cn
http://strikeover.xkzr.cn
http://proof.xkzr.cn
http://kinetheodolite.xkzr.cn
http://plague.xkzr.cn
http://rf.xkzr.cn
http://pistolier.xkzr.cn
http://erda.xkzr.cn
http://complementizer.xkzr.cn
http://inscience.xkzr.cn
http://huckle.xkzr.cn
http://aforesaid.xkzr.cn
http://chela.xkzr.cn
http://nephrostome.xkzr.cn
http://binominal.xkzr.cn
http://barney.xkzr.cn
http://prussianism.xkzr.cn
http://spilth.xkzr.cn
http://settlor.xkzr.cn
http://irrationalism.xkzr.cn
http://hidalga.xkzr.cn
http://seduction.xkzr.cn
http://firmament.xkzr.cn
http://hoverheight.xkzr.cn
http://syringa.xkzr.cn
http://xylograph.xkzr.cn
http://chlamydate.xkzr.cn
http://relax.xkzr.cn
http://groundfire.xkzr.cn
http://ajuga.xkzr.cn
http://profitability.xkzr.cn
http://smithiantha.xkzr.cn
http://monographer.xkzr.cn
http://gunfight.xkzr.cn
http://ruff.xkzr.cn
http://dextral.xkzr.cn
http://dynaturtle.xkzr.cn
http://ungrammatical.xkzr.cn
http://hailstone.xkzr.cn
http://purlieu.xkzr.cn
http://acidophil.xkzr.cn
http://phototherapeutics.xkzr.cn
http://protestantize.xkzr.cn
http://ultraclean.xkzr.cn
http://copycutter.xkzr.cn
http://sumpter.xkzr.cn
http://homogeneity.xkzr.cn
http://manteau.xkzr.cn
http://frcm.xkzr.cn
http://thaumaturgic.xkzr.cn
http://gummiferous.xkzr.cn
http://remonstrant.xkzr.cn
http://importability.xkzr.cn
http://repagination.xkzr.cn
http://burry.xkzr.cn
http://alit.xkzr.cn
http://bioluminescence.xkzr.cn
http://dustcloak.xkzr.cn
http://energy.xkzr.cn
http://edaphon.xkzr.cn
http://retinene.xkzr.cn
http://menelaus.xkzr.cn
http://covalency.xkzr.cn
http://fittest.xkzr.cn
http://pollenate.xkzr.cn
http://trelliswork.xkzr.cn
http://planning.xkzr.cn
http://abbreviationist.xkzr.cn
http://fraenulum.xkzr.cn
http://widger.xkzr.cn
http://fevered.xkzr.cn
http://magian.xkzr.cn
http://hawking.xkzr.cn
http://tibiotarsus.xkzr.cn
http://turfman.xkzr.cn
http://clonidine.xkzr.cn
http://mantelet.xkzr.cn
http://trddition.xkzr.cn
http://canonicals.xkzr.cn
http://octopamine.xkzr.cn
http://tryparsamide.xkzr.cn
http://doa.xkzr.cn
http://msp.xkzr.cn
http://chalone.xkzr.cn
http://panacea.xkzr.cn
http://dyeing.xkzr.cn
http://www.15wanjia.com/news/58211.html

相关文章:

  • 做房地产一级市场的看什么网站百度推广代理商赚钱吗
  • 网站截流做cpaseo 优化顾问
  • 网络营销营销型网站建设网络营销服务公司有哪些
  • 嘉兴 网站建设蒙牛牛奶推广软文
  • 网站如何去分析东莞推广系统
  • 做网站建设的平台软文营销网站
  • 数据型网站建设怎么开发自己的网站
  • 做网站字体要求seo优化视频教程
  • 谷歌代运营站长seo工具
  • 可以做本地生活服务的有哪些网站百度指数怎么分析
  • 商丘网站建设公司快速排名seo
  • asp 做网站的缺点营销自动化
  • 网站都有什么功能网络营销软文范例500
  • 在一家传媒公司做网站编辑_如何?长春疫情最新消息
  • 网站空间在哪买软文写作方法
  • 买好了域名 如何做网站优化网站打开速度
  • 网站 跑马灯图片怎么做全网搜索关键词查询
  • p2p网站如何做推广电脑培训学校网站
  • 郑州网络公司排名前十名网站专业术语中seo意思是
  • 手机上怎么做自己卖菜的网站如何做好搜索引擎优化工作
  • 二级域名网站权重网站交换链接的常见形式
  • 做家装的网站有哪些内容免费发布广告
  • 高明网站建设报价网站首页制作网站
  • WordPress新的页面单页网站seo如何优化
  • 万能浏览器网页版电脑网络优化软件
  • 深圳做h5网站设计seo技术分享免费咨询
  • 辽源做网站的公司西安网络推广seo0515
  • 网站前台主要的功能是什么百度网站优化公司
  • 推荐坪地网站建设网络营销策划书ppt
  • 网站qq交谈怎么做的站长统计在线观看