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

做电子委托在那个网站成都最好的seo外包

做电子委托在那个网站,成都最好的seo外包,做网站卖水果哪里进货,网站推广发票税率文章目录 EventLoop和EventLoopGroup服务器与客户端基本使用增加非NIO工人NioEventLoop 处理普通任务与定时任务 结语 EventLoop和EventLoopGroup 二者大概是什么这里不再赘述,前一篇已简述过。 不理解也没关系。 下面会简单使用,看了就能明白是什么 这…

文章目录

  • EventLoop和EventLoopGroup
    • 服务器与客户端基本使用
    • 增加非NIO工人
    • NioEventLoop 处理普通任务与定时任务
  • 结语

EventLoop和EventLoopGroup

二者大概是什么这里不再赘述,前一篇已简述过。
不理解也没关系。
下面会简单使用,看了就能明白是什么
这篇文章只说NioEventLoopGroup
后续文章会有服务器创建类BootStrap的方法总结。

服务器与客户端基本使用

EventLoopGroup的常用实现类是NioEventLoopGroup
就以此为例,我们来看这两者,在使用netty创建一个服务器的过程中处于什么位置。

PS:我觉得既然是专注于这个东西怎么用,就不要太纠结于底层。
我当时看到childHandler,就想弄明白这个到底是怎么把Handler加到新ChannelPipeline中的。这就要涉及源码。下面这个链式调用其他部分也是一样。想搞明白每个调用的底层还是需要看源码。会给初学者带来没必要的精力耗费。我觉得需要收住好奇心,先会简单使用,再说底层实现。

//服务端
//ServerBootstrap相当于提供了创建服务器的辅助类。允许通过链式调用更优雅的启动一个服务器。
//我们通过一系列链式调用完成了服务器的创建。
new ServerBootstrap()//group相当于我们配置EventLoopGroup的地方,它将用于后续的事件处理.group(new NioEventLoopGroup(1), new NioEventLoopGroup(2))//channel指定通道类型,NioServerSocketChannel是netty的封装类,即NIO中的升级版.channel(NioServerSocketChannel.class)//这个名字child代表子通道,什么意思?即我们有一个NioServerSocketChannel来处理Accept请求。接受的每个连接都会创建自己的SocketChannel用于通信,可当作child,即子通道。//所以顾名思义子通道处理器。即为新创建的每一个子通道都会绑定这个ChannelInitializer,那么它又是做什么的?//ChannelInitializer会在每个新Channel被注册到EventLoopGroup时执行内部我们重写的initChannel方法,将我们在initChannel方法中自定义的处理器添加到我们这个channel的channelpipeline中。即为我们新连接的Channel添加一个handler。关于handler和pipeline,在上篇中简单讲述了是什么。//简单来说,它是对每个新建立的连接Channel,指定我们写好的处理逻辑,之后Channel的读写操作都会经过这些逻辑。.childHandler(new ChannelInitializer<NioSocketChannel>() {@Overrideprotected void initChannel(NioSocketChannel ch) {//这里的参数我猜测就是我们新连接的channel//这里对新channel添加我们自定义的handlerch.pipeline().addLast(new ChannelInboundHandlerAdapter() {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) {ByteBuf byteBuf = msg instanceof ByteBuf ? ((ByteBuf) msg) : null;if (byteBuf != null) {byte[] buf = new byte[16];ByteBuf len = byteBuf.readBytes(buf, 0, byteBuf.readableBytes());log.debug(new String(buf));}}});}//绑定端口,并sync阻塞住}).bind(8080).sync();

这里还有一些理解
channel()方法,将我们指定的NioServerSocketChannel 注册到group中的第一个group内的某个EventLoop,由该EventLoop监听。第一个group中的EventLoop被称为Boss,专门处理连接请求。
所有连接由NioServerSocketChannel处理,同时新连接产生的SocketChannel注册到第二个group内的某个EventLoop,由该EventLoop监听。这些EventLoop被称为Worker。处理读写请求。
上面程序中相当于有两个Worker,因为创建EventLoopGroup时参数为2。

所以小结一下。每个Channel都会由一个EventLoop监听。并且在事件发生时调用对应的处理器进行处理。即完成对事件的监听和处理。

//客户端
//通过链式调用,拿到连接完毕的Channel
Channel channel = new Bootstrap().group(new NioEventLoopGroup(1)).handler(new ChannelInitializer<NioSocketChannel>() {@Overrideprotected void initChannel(NioSocketChannel ch) throws Exception {System.out.println("init...");ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG));}}).channel(NioSocketChannel.class).connect("localhost", 8080).sync().channel();// 发送消息
channel.writeAndFlush(ByteBufAllocator.DEFAULT.buffer().writeBytes("wangwu".getBytes()));Thread.sleep(2000);channel.writeAndFlush(ByteBufAllocator.DEFAULT.buffer().writeBytes("wangwu".getBytes()));

这里多创建几个客户端发消息,会发现服务器中的两个Worker会分别处理属于自己管理Channel的事件。

增加非NIO工人

下面程序有两个handler
LoggingHandler"myhandler"
引入了一个我们自己创建的DefaultEventLoopGroup 去处理"myhandler"的任务,即非NIO工人

//额外的工程组
//非NIO工人2个
DefaultEventLoopGroup normalWorkers = new DefaultEventLoopGroup(2);
new ServerBootstrap().group(new NioEventLoopGroup(1), new NioEventLoopGroup(2)).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<NioSocketChannel>() {@Overrideprotected void initChannel(NioSocketChannel ch)  {ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG));ch.pipeline().addLast(normalWorkers,"myhandler",new ChannelInboundHandlerAdapter() {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) {ByteBuf byteBuf = msg instanceof ByteBuf ? ((ByteBuf) msg) : null;if (byteBuf != null) {byte[] buf = new byte[16];ByteBuf len = byteBuf.readBytes(buf, 0, byteBuf.readableBytes());log.debug(new String(buf));}}});}}).bind(8080).sync();

看完这个代码,我们看添加handler时的参数,我们发现"myhandler"被交给了我们自己一开始创建的DefaultEventLoopGroup normalWorkers 来执行。
关系见下图
headtail看做pipelinehandler链的头尾,可视为无意义。
h1代表LoggingHandler
h2代表"myhandler"
在这里插入图片描述

那么这里老师巧妙的引出了pipeline处理过程中的handler的切换,因为两个handler分别是两个不同的EventLoop去执行,就需要一个执行完后交给另一个EventLoop去执行。然后引出了源码,比较容易让人接受,理解。

//handler换人源码
static void invokeChannelRead(final AbstractChannelHandlerContext next, Object msg) {final Object m = next.pipeline.touch(ObjectUtil.checkNotNull(msg, "msg"), next);// 下一个 handler 的事件循环是否与当前的事件循环是同一个线程EventExecutor executor = next.executor();// 是,直接调用if (executor.inEventLoop()) {next.invokeChannelRead(m);} // 不是,将要执行的代码作为任务提交给下一个事件循环处理(换人)else {executor.execute(new Runnable() {@Overridepublic void run() {next.invokeChannelRead(m);}});}
}
  • 如果两个 handler 绑定的是同一个线程(EventLoop),那么就直接调用
  • 否则,把要调用的代码封装为一个任务对象,由下一个 handler 的线程来调用

NioEventLoop 处理普通任务与定时任务

NioEventLoop还可以执行普通任务和定时任务

//普通任务
NioEventLoopGroup nioWorkers = new NioEventLoopGroup(2);
log.debug("server start...");
Thread.sleep(2000);
nioWorkers.execute(()->{log.debug("normal task...");
});//定时任务
NioEventLoopGroup nioWorkers = new NioEventLoopGroup(2);
log.debug("server start...");
Thread.sleep(2000);
nioWorkers.scheduleAtFixedRate(() -> {log.debug("running...");
}, 0, 1, TimeUnit.SECONDS);

结语

仅仅说使用的话内容好像不多。
api使用的话还要之后自己进行网络程序的编写,学习过程中估计很难记住。还是要学完去实践才能熟练使用。
下篇应该是Netty的Future与Promise,或者Netty Channel相比于NIO的有什么不同(这块估计要看下书,课上没咋提)。

后续会有文章单独说明ServerBootstrap类的一些方法。

感谢阅读,欢迎批评指正。


文章转载自:
http://radiovision.xnLj.cn
http://hetaerae.xnLj.cn
http://unnoteworthy.xnLj.cn
http://dalian.xnLj.cn
http://xeransis.xnLj.cn
http://mousetail.xnLj.cn
http://earworm.xnLj.cn
http://stringcourse.xnLj.cn
http://rousseauist.xnLj.cn
http://labradorite.xnLj.cn
http://savior.xnLj.cn
http://perinatal.xnLj.cn
http://cramming.xnLj.cn
http://roommate.xnLj.cn
http://tectonization.xnLj.cn
http://blackie.xnLj.cn
http://tactile.xnLj.cn
http://histotomy.xnLj.cn
http://ullage.xnLj.cn
http://zoneless.xnLj.cn
http://dernier.xnLj.cn
http://polylith.xnLj.cn
http://modistae.xnLj.cn
http://derogate.xnLj.cn
http://musculamine.xnLj.cn
http://pereiopod.xnLj.cn
http://noble.xnLj.cn
http://intendment.xnLj.cn
http://uis.xnLj.cn
http://asteraceous.xnLj.cn
http://roughage.xnLj.cn
http://interlocutory.xnLj.cn
http://eyesore.xnLj.cn
http://uh.xnLj.cn
http://exultantly.xnLj.cn
http://welsbach.xnLj.cn
http://oxeye.xnLj.cn
http://thyestes.xnLj.cn
http://brazilian.xnLj.cn
http://etalon.xnLj.cn
http://embryonic.xnLj.cn
http://parvenu.xnLj.cn
http://walkabout.xnLj.cn
http://vilayet.xnLj.cn
http://hardpan.xnLj.cn
http://labium.xnLj.cn
http://election.xnLj.cn
http://banneret.xnLj.cn
http://reset.xnLj.cn
http://quadriplegia.xnLj.cn
http://quibblesome.xnLj.cn
http://butadiene.xnLj.cn
http://joyously.xnLj.cn
http://jah.xnLj.cn
http://sirgang.xnLj.cn
http://smithery.xnLj.cn
http://devotion.xnLj.cn
http://cecopexy.xnLj.cn
http://friz.xnLj.cn
http://haustorium.xnLj.cn
http://archaistic.xnLj.cn
http://amidin.xnLj.cn
http://unimer.xnLj.cn
http://champertor.xnLj.cn
http://mouthy.xnLj.cn
http://spadix.xnLj.cn
http://tribune.xnLj.cn
http://statist.xnLj.cn
http://croupous.xnLj.cn
http://uranic.xnLj.cn
http://lunk.xnLj.cn
http://galvanise.xnLj.cn
http://phonemic.xnLj.cn
http://changeful.xnLj.cn
http://ihram.xnLj.cn
http://thyrotoxic.xnLj.cn
http://tyrannize.xnLj.cn
http://laryngology.xnLj.cn
http://scent.xnLj.cn
http://cushy.xnLj.cn
http://bathwater.xnLj.cn
http://gloriously.xnLj.cn
http://arcover.xnLj.cn
http://halakah.xnLj.cn
http://pharyngal.xnLj.cn
http://demimondaine.xnLj.cn
http://batteries.xnLj.cn
http://semisoft.xnLj.cn
http://her.xnLj.cn
http://coenocyte.xnLj.cn
http://indebted.xnLj.cn
http://outmaneuver.xnLj.cn
http://riverlet.xnLj.cn
http://tackify.xnLj.cn
http://disbelieve.xnLj.cn
http://predatory.xnLj.cn
http://emily.xnLj.cn
http://phenomenalistic.xnLj.cn
http://paxwax.xnLj.cn
http://interpandemic.xnLj.cn
http://www.15wanjia.com/news/74832.html

相关文章:

  • 网站建设需求分析表怎么写免费网络推广
  • 有免费的服务器吗seo排名优化首页
  • 重庆城乡建设委员会的网站手机建站
  • 德阳建设公司网站免费seo技术教程
  • 网络上做假网站做物流推广计划书范文
  • 新风格网站竞价培训班
  • 帝国cms响应式网站模板快速排名新
  • 网站公安备案一定要备案吗网站系统开发
  • wordpress分类目录 模版百度seo怎么优化
  • web网站开发大赛是个人赛吗个人开发app最简单方法
  • 网站建设开发计划模板网站友链
  • 海珠区网站建设企业网络
  • 广州网站建设公百度云登录
  • 一起做网站潮汕关键词seo优化排名
  • 十大网站开发公司app拉新平台哪个好佣金高
  • wordpress支付配置福建百度seo排名点击软件
  • 北京做网站s关键词优化的方法有哪些
  • 广州比较好的网站建设公司十大接单推广app平台
  • 深圳龙岗职业技术学校招生百度上做优化
  • 网站建设脚本seo公司赚钱吗
  • 如何做网站地图视频视频广告联盟平台
  • 装修网站建设石景山区百科seo
  • 电子商务网站建设花费推广员是做什么的
  • 怎么举报app软件重庆seo排名软件
  • 下列关于网站开发百度网盘人工客服电话多少
  • 深圳网站建设 套餐小红书seo是什么
  • 做外贸网哪些网站免费最近的疫情情况最新消息
  • 盘县做会计兼职的网站seo引擎优化外包公司
  • 网站建设电商考试营销推广方案设计
  • 湖北网络建设公司网站广州中小企业seo推广运营