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

便捷网站建设哪家便宜世界足球排名

便捷网站建设哪家便宜,世界足球排名,ip会变怎么做网站,万先生网站文章目录1.ServerBootstrap2.服务端启动过程3.具体步骤分析3.1 创建服务端Channel3.2 初始化服务端Channel3.3 注册selector3.4 端口绑定1.ServerBootstrap ServerBootstrap引导服务端启动流程: //主EventLoopGroup NioEventLoopGroup master new NioEventLoopGroup(); //从E…

文章目录

      • 1.ServerBootstrap
      • 2.服务端启动过程
      • 3.具体步骤分析
        • 3.1 创建服务端Channel
        • 3.2 初始化服务端Channel
        • 3.3 注册selector
        • 3.4 端口绑定

1.ServerBootstrap

ServerBootstrap引导服务端启动流程:

在这里插入图片描述


//主EventLoopGroup
NioEventLoopGroup master = new NioEventLoopGroup();
//从EventLoopGroup
NioEventLoopGroup worker = new NioEventLoopGroup();
//服务端引导类
ServerBootstrap bootstrap = new ServerBootstrap();
//配置主从EventLoopGroup
bootstrap.group(master, worker);
//channel选项配置
bootstrap.option(ChannelOption.SO_KEEPALIVE, true).option(ChannelOption.CONNECT_TIMEOUT_MILLIS,5000);
bootstrap.channel(NioServerSocketChannel.class);
//主EventLoopGroup ChannelHandler配置
bootstrap.handler(new ChannelInboundHandlerAdapter(){@Overridepublic void channelRegistered(ChannelHandlerContext ctx) throws Exception {System.out.println("Master:" + ctx.channel().eventLoop().toString());super.channelRegistered(ctx);}
});
//从EventLoopGroup ChannelHandler配置
bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {System.out.println("Child:" + ch.eventLoop().toString());}
});
//调用bind方法开始监听端口8888
ChannelFuture future = bootstrap.bind(8888).sync();
future.channel().closeFuture().sync();master.shutdownGracefully().sync();

以上代码使用的是Netty框架中经典的主从事件驱动模式

2.服务端启动过程

  1. main方法调用ServerBootstrap.bind()方法

  2. validate()方法验证必要配置参数

  3. 调用AbstractBootstrap.initAndRegister()方法

  4. 调用channelFactory.newChannel()方法创建Channel实例

  5. ServerBootstrap.init()初始化Channel实例,配置ChannelOption、attributes;在Channel的pipeline中配置默认的ChannelHandler实例

  6. 将Channel实例注册到主EventLoopGroup中并返回ChannelFuture

  7. 注册ChannelFuture回调,在完成后调用channel.bind()方法完成端口监听

3.具体步骤分析

1.创建服务端Channel
2.初始化服务端Channel
3.注册Selector
4.端口绑定

3.1 创建服务端Channel

在这里插入图片描述

AbstractBootstrap.bind()

在这里插入图片描述

  1. validate(): 验证必要配置参数
  2. AbstractBootstrap.doBind()

在这里插入图片描述

AbstractBootstrap.initAndRegister()

在这里插入图片描述

  1. 利用反射创建Channel, 得到NioServerSocketChannel
  2. 初始化channel中的一些参数

在这里插入图片描述

AbstractBootstrap.channel() 反射创建Channel

在这里插入图片描述

利用反射创建channel, 得到ReflectiveChannelFactory, 调用channelFactory利用工厂模式, 最后生成NioServerSocketChannel

在这里插入图片描述

3.2 初始化服务端Channel

ServerBootstrap.init() 初始化一些基本参数

初始化一些Options和Attrs和group和handler的参数

在这里插入图片描述

    @Overridevoid init(Channel channel) throws Exception {final Map<ChannelOption<?>, Object> options = options0();synchronized (options) {setChannelOptions(channel, options, logger);}final Map<AttributeKey<?>, Object> attrs = attrs0();synchronized (attrs) {for (Entry<AttributeKey<?>, Object> e: attrs.entrySet()) {@SuppressWarnings("unchecked")AttributeKey<Object> key = (AttributeKey<Object>) e.getKey();channel.attr(key).set(e.getValue());}}ChannelPipeline p = channel.pipeline();final EventLoopGroup currentChildGroup = childGroup;final ChannelHandler currentChildHandler = childHandler;final Entry<ChannelOption<?>, Object>[] currentChildOptions;final Entry<AttributeKey<?>, Object>[] currentChildAttrs;synchronized (childOptions) {currentChildOptions = childOptions.entrySet().toArray(newOptionArray(0));}synchronized (childAttrs) {currentChildAttrs = childAttrs.entrySet().toArray(newAttrArray(0));}p.addLast(new ChannelInitializer<Channel>() {@Overridepublic void initChannel(final Channel ch) throws Exception {final ChannelPipeline pipeline = ch.pipeline();ChannelHandler handler = config.handler();if (handler != null) {pipeline.addLast(handler);}ch.eventLoop().execute(new Runnable() {@Overridepublic void run() {pipeline.addLast(new ServerBootstrapAcceptor(ch, currentChildGroup, currentChildHandler, currentChildOptions, currentChildAttrs));}});}});}

在这里插入图片描述

设置 currentChildGroup, currentChildHandler, currentChildOptions, currentChildAttrs

在这里插入图片描述

在Channel的pipeline中配置默认的ChannelHandler实例

在这里插入图片描述

ServerBootstrapAcceptor 添加连接器, ServerBootstrapAcceptor本质是一个handler

3.3 注册selector

bind -> initAndRegister -> AbstractChannel.register -> this.eventLoop = eventLoop, register0 实际注册 -> doRegister(), invokeHandlerAddedIfNeeded(), fireChannelRegistered() 传播事件

在这里插入图片描述

AbstractChannel.AbstractUnsafe.register()

在这里插入图片描述

register0()

在这里插入图片描述

AbstractNioChannel.doRegister()

在这里插入图片描述

上面有javaChannel.register(), 利用jdk底层去创建selector

3.4 端口绑定

bind() -> doBind() -> doBind0() -> AbstracChannel,bind() -> DefaultChannelPipeline.bind() -> AbstractChannlHandlerContext.bind() -> AbstractChannlHandlerContext.invokeBind() -> DefaultChannelPipeline.HeadContext.bind() -> NioSocketChannel.doBind0(), pipeline.fireChannelActive();

最后将会调用DefaultChannelPipeline.HeadContext.bind(), 因为DefaultChannelPipeline在初始化时会设置pipeline队列的首尾分别为DefaultChannelPipeline.HeadContext与DefaultChannelPipeline.TailContext
bind()在Pipeline中走的是出站方法,是从管道的后面向前走,最后到达管道头部的ChannelHandler(也就是DefaultChannelPipeline.HeadContext),这一过程会调用同一方向上所有ChannelHandler的bind()事件。

AbstractBootstrap.doBind0(): 添加一个任务至EventLoop中, 最后将会调用DefaultChannelPipeline.HeadContext.bind()方法

在这里插入图片描述

AbstractChannlHandlerContext.invokeBind()

在这里插入图片描述

DefaultChannelPipeline.HeadContext.bind() -> AbstractChannel.AbstractUnsafe.bind()

        @Overridepublic final void bind(final SocketAddress localAddress, final ChannelPromise promise) {assertEventLoop();if (!promise.setUncancellable() || !ensureOpen(promise)) {return;}boolean wasActive = isActive();try {doBind(localAddress);} catch (Throwable t) {safeSetFailure(promise, t);closeIfClosed();return;}if (!wasActive && isActive()) {invokeLater(new Runnable() {@Overridepublic void run() {pipeline.fireChannelActive();}});}safeSetSuccess(promise);}
  1. NioSocketChannel.doBind() -> NioSocketChannel.doBind0()
  2. pipeline.fireChannelActive()

通过在pipline中的层层传递, 现在来到了最终执行bind操作的终点, 执行bind方法,

在这里插入图片描述

可以通过SocketUtils.bind() 绑定JDK底层的端口

最后如果触发了一个事件的话, 会调用Channel.read()事件(AbstractNioChannel.doBeginRead()), 这个事件对于服务端来说就是一个新的连接接入。

http://www.dinnco.com/news/52735.html

相关文章:

  • 北京网站建设公司华网天下淘宝网络营销方式
  • 网站加载效果怎么做的网站建设的重要性
  • ecto wordpress北京搜索引擎优化
  • 北京数字智慧展厅设计装修服务商网站查询工具seo
  • 先做网站装修还是先买虚拟主机百度收录查询接口
  • 歪咪小麻花官方网站怎么做零售网络营销师证
  • 卖高仿名牌手表网站信息推广服务
  • 度假村网站模板网络推广都需要做什么
  • 专业网站建设公司推荐cpa推广接单平台
  • 做外语网站电商运营数据六大指标
  • 怎么做网站接家纺订单seo免费浏览网站
  • 余姚专业做网站公司信息流广告投放公司
  • 做好宣传信息网推广工作招聘seo专员
  • 建设局网站打不开是什么原因百度云网盘资源
  • 意大利设计网站南宁优化推广服务
  • 网站两侧对联广告图片产品推广策划
  • 做杂志的模板下载网站品牌营销策划十大要点
  • 成套小说网站模板aso优化怎么做
  • 男女之间做下面哪个网站免费app营销策略
  • 网站或站点的第一个网页天天广告联盟
  • 都匀住房与城乡建设部网站西安今天出大事
  • 一个网站好不好低价刷粉网站推广
  • 甘肃疫情最新消息2021wp博客seo插件
  • 微网站自助建站西安百度推广运营
  • 太原零元网站建设如何进行网络营销推广
  • 软件开发培训学校收费标准公示优化是什么意思?
  • 网站需求分怎么找到精准客户资源
  • 网站建设中技术程序互联网运营主要做什么
  • 专业做动漫的网站公司企业网站制作
  • h5网站设计欣赏发布软文