引导Bootstrap

引导一个应用程序是指对他进行配置并且使他运行的过程。

体系结构


注意,DotNetty没有实现Cloneable的接口,而是直接实现了一个Clone方法。Netty实现这个接口是为了创建两个有着相同配置的应用程序,可以把一个配置整体应用到另一个上面,需要注意的是EventLoopGroup是一个浅拷贝,这就导致了拷贝的Bootstrap都会使用同一个EventLoopGroup,这在每个Channel生命周期很短的时候是没有太大影响的。

服务器引导和普通引导有什么区别呢?区别在于,服务器接收到客户端的连接请求,会用一个Channel接受连接,然后用另一个Channel与客户端进行交流,但是客户端只需要一个Channel就可以与服务器进行交互。

关于链式调用

我们发现Bootstrap类可以通过流式语法进行链式调用,这要归功于Bootstrap类的特殊定义。下面我们来看一下:

// 定义
public abstract class AbstractBootstrap<TBootstrap, TChannel>where TBootstrap : AbstractBootstrap<TBootstrap, TChannel>where TChannel : IChannel
// 定义子类
public class Bootstrap : AbstractBootstrap<Bootstrap, IChannel>
// 方法实现
public virtual TBootstrap Group(IEventLoopGroup group)
{Contract.Requires(group != null);if (this.group != null){throw new InvalidOperationException("group has already been set.");}this.group = group;return (TBootstrap)this;
}
// 使用
var bootstrap = new Bootstrap();
bootstrap.Group(group).Channel<TcpSocketChannel>().Handler(new ActionChannelInitializer<ISocketChannel>(channel =>{IChannelPipeline pipeline = channel.Pipeline;pipeline.AddLast(new EchoClientHandler());}));

API


客户端引导

var group = new MultithreadEventLoopGroup();
var bootstrap = new Bootstrap();
bootstrap.Group(group).Channel<TcpSocketChannel>().Handler(new ActionChannelInitializer<ISocketChannel>(channel =>{IChannelPipeline pipeline = channel.Pipeline;pipeline.AddLast(new EchoClientHandler());}));
IChannel clientChannel = await bootstrap.ConnectAsync(new IPEndPoint(IPAddress.Parse("10.10.10.158"), 3000));
Console.ReadLine();
await clientChannel.CloseAsync();

服务器引导

API:

注意上面箭头指示的是与Bootstrap不一样的方法。
为什么会有子Channel的概念呢,我们看下面这个图:

因为服务器是一对多的,所以有子Channel的概念。

IEventLoopGroup eventLoop;
eventLoop = new MultithreadEventLoopGroup();
try
{// 服务器引导程序var bootstrap = new ServerBootstrap();bootstrap.Group(eventLoop);bootstrap.Channel<TcpServerSocketChannel>();bootstrap.ChildHandler(new ActionChannelInitializer<IChannel>(channel =>{IChannelPipeline pipeline = channel.Pipeline;pipeline.AddLast(new EchoServerHandler());}));IChannel boundChannel = await bootstrap.BindAsync(3000);Console.ReadLine();await boundChannel.CloseAsync();
}
catch (Exception ex)
{Console.WriteLine(ex);
}
finally
{await eventLoop.ShutdownGracefullyAsync();
}

从Channel中引导客户端

  • 场景

    如果我们的服务器需要去第三方获取数据,这时候服务器就需要充当客户端去第三方取数据,这时候就需要在Channel中再开一个客户端获取数据。

  • 方式

    我们最好是从Channel中获取当前EventLoop,这样新开的客户端就跟当前Channel在一个线程中,减少了线程切换带来的开销,尽可能的重用了EventLoop

  • 实现

    // 从Context创建客户端引导
    var bootstrap = new Bootstrap();
    bootstrap.Group(ctx.Channel.EventLoop);
    

初始化Pipeline

如果要添加的Handler不止一个,我们就需要用到ChannelInitializer,在DotNetty中,我们有十分简单的方法可以初始化一个pipeline

var bootstrap = new Bootstrap();
bootstrap.Group(group).Channel<TcpSocketChannel>().Option(ChannelOption.TcpNodelay, true).Handler(new ActionChannelInitializer<ISocketChannel>(channel =>{IChannelPipeline pipeline = channel.Pipeline;if (cert != null){pipeline.AddLast("tls", new TlsHandler(stream => new SslStream(stream, true, (sender, certificate, chain, errors) => true), new ClientTlsSettings(targetHost)));}pipeline.AddLast(new LoggingHandler());pipeline.AddLast("framing-enc", new LengthFieldPrepender(2));pipeline.AddLast("framing-dec", new LengthFieldBasedFrameDecoder(ushort.MaxValue, 0, 2, 0, 2));pipeline.AddLast("echo", new EchoClientHandler());}));

ChannelOption

ChannelOption可以在引导的时候将设置批量的设置到所有Channel上,而不必要在每一个Channel建立的时候手动的去指定它的配置,应用场景是比如设置KeepAlive或者设置超时时间。

bootstrap.Option(ChannelOption.SoKeepalive, true).Option(ChannelOption.ConnectTimeout, new TimeSpan(5000));

面向无连接的用户数据报文

UDP的全称是“User Datagram Protocol”,在DotNetty中实现了SocketDatagramChannel来创建无连接的引导,需要注意的是无连接的引导不需要Connect只需要bind即可,代码如下:

var bootstrap = new Bootstrap();
bootstrap.Group(group).Channel<SocketDatagramChannel>().Option(ChannelOption.SoBroadcast, true).Handler(new ActionChannelInitializer<IChannel>(channel =>{channel.Pipeline.AddLast("Quote", new QuoteOfTheMomentClientHandler());}));IChannel clientChannel = await bootstrap.BindAsync(IPEndPoint.MinPort);

关闭

Channel的关闭:

await clientChannel.CloseAsync();

EventLoopGroup的关闭:

await group.ShutdownGracefullyAsync();

DotNetty完全教程(九)相关推荐

  1. PVE系列教程(九)、openWRT设置主路由与旁路由模式

    PVE系列教程(九).openWRT设置主路由与旁路由模式 为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客http://nas.hepcloud.top:7000 Hello,小伙伴们,这是凯尔 ...

  2. uCOS-II 基础入门教程(九)

    建立任务,OSTaskCreate() 想让µC/OS-Ⅱ管理用户的任务,用户必须要先建立任务.用户可以通过传递任务地址和其它参数到以下两个函数之一来建立任务:OSTaskCreate() 或 OST ...

  3. DotNetty完全教程(二)

    第一个DotNetty应用程序 准备工作 NuGet包介绍 DotNetty由九个项目构成,在NuGet中都是单独的包,可以按需引用,其中比较重要的几个是以下几个: DotNetty.Common 是 ...

  4. php语+言教程,写给thinkphp开发者的laravel系列教程(九)打印数据-Fun言

    php这种脚本语言调试起来是很方便的: 大多时候看报错打印一下数据就知道问题所在了: php 内置了常用打印函数 print 和 var_dump : 但是打印出来的样式实在让人目瞪狗呆: think ...

  5. geoserver安装_pgRouting教程九:使用GeoServer发布WMS/WFS接口

    本文衔接上篇文章: 不睡觉的怪叔叔:pgRouting教程八:使用pl/pgsql写存储过程​zhuanlan.zhihu.com 上篇文章使用pl/pgsql实现了存储过程,本文将使用GeoServ ...

  6. 黄聪:Microsoft Enterprise Library 5.0 系列教程(九) Policy Injection Application Block

    代理对象(Proxy Object)会通过Handler链定位到真实对象(Real Object),而Policy则被注入到代理对象和真实对象中.整个流程如图: 我个人对Policy Injectio ...

  7. sql 新建发布 找不到存储过程_pgRouting教程九:使用GeoServer发布WMS/WFS接口

    本文衔接上篇文章: 不睡觉的怪叔叔:pgRouting教程八:使用pl/pgsql写存储过程​zhuanlan.zhihu.com 上篇文章使用pl/pgsql实现了存储过程,本文将使用GeoServ ...

  8. Redis系列教程(九):Redis的内存回收原理,及内存过期淘汰策略详解

    Redis内存回收机制 Redis的内存回收主要围绕以下两个方面: 1.Redis过期策略:删除过期时间的key值 2.Redis淘汰策略:内存使用到达maxmemory上限时触发内存淘汰数据 Red ...

  9. RxJava2.0的初学者必备教程(九)

    前言 好久不见朋友们,最近一段时间在忙工作上的事情,这两天正好有点时间,赶紧写下了这篇教程,免得大家说我太咸了. 正题 先来回顾一下上上节,我们讲Flowable的时候,说它采用了响应式拉的方式,我们 ...

最新文章

  1. JS中class和id的区别
  2. figure diagram illustrate exemplify profile
  3. 在实际使用中 mysql所支持的触发器有_计算机二级考试MySQL数据库每日一练 12月26日...
  4. 让VC编译的Release版本程序在其他机器上顺利运行
  5. 《数据库SQL实战》查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t
  6. 月入过万?就靠SEO了
  7. Python文档阅读笔记-OpenCV中Template Matching
  8. C++中模块(DLL)对外暴露接口的几种方式
  9. 最新!华为HCIA网络工程师题库精讲(02)
  10. 基于asp.net固定资产管理系统设计
  11. tor浏览器匿名上网_如何使用Tor匿名浏览
  12. mysql获取纽约时间_如何在脚本中处理MySQL时区
  13. Android7.0手机运行谷歌daydream的方法
  14. 抽奖活动前端源码-可录入抽奖人名单
  15. 爆红十年后,谁“切”了苹果?
  16. matlab冲激函数delta,信号与系统matlab实验指导书解决方案.doc
  17. 3735平板装win和linux双系统,流行的就一定好?浅谈双系统平板的利与弊
  18. 开始报名啦!——第二届融360“天机”金融风控大数据竞赛火热来袭
  19. adobe pdf 高级搜索功能
  20. 项目经理该怎样做好项目质量管理工作?

热门文章

  1. 读设计模式之禅--模板方法模式
  2. IPsec ISAKMP(转)
  3. Shop7z网上购物系统至尊版
  4. 版权——如何自己申请软件著作权-注册篇
  5. 运算放大器-同相放大器
  6. 数据结构 面试相关整理
  7. 泰坦尼克(机器学习逻辑回归)
  8. android service白名单,Android 后台运行白名单实现保活
  9. matlab语言帮助系统作业答案,国开《Matlab语言及其应用》形考任务答案
  10. oracle服务端安装