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

十大免费自助建站徐州百度搜索网站排名

十大免费自助建站,徐州百度搜索网站排名,那个网站做图片好看的,wordpress百度推送插件久以来,.Net开发人员都非常羡慕Java有Netty这样#xff0c;高效#xff0c;稳定又易用的网络通信基础框架。终于微软的Azure团队#xff0c;使用C#实现的Netty的版本发布。不但使用了C#和.Net平台的技术特点#xff0c;并且保留了Netty原来绝大部分的编程接口。让我们在使用… 久以来,.Net开发人员都非常羡慕Java有Netty这样高效稳定又易用的网络通信基础框架。终于微软的Azure团队使用C#实现的Netty的版本发布。不但使用了C#和.Net平台的技术特点并且保留了Netty原来绝大部分的编程接口。让我们在使用时完全可以依照Netty官方的教程来学习和使用DotNetty应用程序。DotNetty同时也是开源的它的源代码托管在Github上:https://github.com/azure/dotnetty0x01 项目预览从github上下载最新的代码到本地使用VS2017或者VSCode打开下载好的代码可以看到如图所示的代码那结构其中源码部分有9个项目组成其中DotNetty.Common 是公共的类库项目包装线程池并行任务和常用帮助类的封装DotNetty.Transport 是DotNetty核心的实现DotNetty.Buffers 是对内存缓冲区管理的封装DotNetty.Codes 是对编解码是封装包括一些基础基类的实现我们在项目中自定义的协议都要继承该项目的特定基类和实现DotNetty.Handlers 封装了常用的管道处理器比如Tls编解码超时机制心跳检查日志等如果项目中没有用到可以不引用不过一般都会用到其他还有对Redis的编解码Mqtt的编解码Protobuf2/3的编解码项目中可根据实际情况引用很遗憾Http协议和Websocket协议还没有实现。0x02 快速开始-示例-回声程序的实现从上一步下载的代码中看到有一个sample目录有很多例子都大同小异 先来看这个最简单的Echo服务的实现吧.Echo服务分为服务端和客户端服务端使用DotNetty框架启动一个Socket服务并等待客户端链接当客户端链接并接收客户端消息并将接收到的消息原样返回给客户端。而客户端同样使用DotNetty框架启动一个Socket客户端服务并链接到服务端并发送一条Hello的字符串信息并等待服务端返回。如此往复。2.1 Echo Server来一起看一下代码吧我把注释都写到代码中static async Task RunServerAsync() {    //设置输出日志到Console    ExampleHelper.SetConsoleLogger();    // 主工作线程组设置为1个线程    var bossGroup new MultithreadEventLoopGroup(1);    // 工作线程组默认为内核数*2的线程数    var workerGroup new MultithreadEventLoopGroup();    X509Certificate2 tlsCertificate null;        if (ServerSettings.IsSsl) //如果使用加密通道            {                tlsCertificate new X509Certificate2(Path.Combine(ExampleHelper.ProcessDirectory, dotnetty.com.pfx), password);            }                           try            {                                //声明一个服务端Bootstrap每个Netty服务端程序都由ServerBootstrap控制                //通过链式的方式组装需要的参数                var bootstrap new ServerBootstrap();                bootstrap                    .Group(bossGroup, workerGroup) // 设置主和工作线程组                    .ChannelTcpServerSocketChannel() // 设置通道模式为TcpSocket                    .Option(ChannelOption.SoBacklog, 100) // 设置网络IO参数等这里可以设置很多参数当然你对网络调优和参数设置非常了解的话你可以设置或者就用默认参数吧                    .Handler(new LoggingHandler(SRV-LSTN)) //在主线程组上设置一个打印日志的处理器                    .ChildHandler(new ActionChannelInitializerISocketChannel(channel                    { //工作线程连接器 是设置了一个管道服务端主线程所有接收到的信息都会通过这个管道一层层往下传输//同时所有出栈的消息 也要这个管道的所有处理器进行一步步处理                        IChannelPipeline pipeline channel.Pipeline;                        if (tlsCertificate ! null) //Tls的加解密                        {                            pipeline.AddLast(tls, TlsHandler.Server(tlsCertificate));                        }                        //日志拦截器                        pipeline.AddLast(new LoggingHandler(SRV-CONN));//出栈消息通过这个handler 在消息顶部加上消息的长度                        pipeline.AddLast(framing-enc, new LengthFieldPrepender(2));//入栈消息通过该Handler,解析消息的包长信息并将正确的消息体发送给下一个处理Handler该类比较常用后面单独说明                        pipeline.AddLast(framing-dec, new LengthFieldBasedFrameDecoder(ushort.MaxValue, 0, 2, 0, 2));//业务handler 这里是实际处理Echo业务的Handler                        pipeline.AddLast(echo, new EchoServerHandler());                    }));                    // bootstrap绑定到指定端口的行为 就是服务端启动服务同样的Serverbootstrap可以bind到多个端口                IChannel boundChannel await bootstrap.BindAsync(ServerSettings.Port);                Console.ReadLine();//关闭服务                await boundChannel.CloseAsync();            }                          finally            {//释放工作组线程                await Task.WhenAll(                    bossGroup.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1)),                    workerGroup.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1)));            }        }来看下实际的业务代码比较简单也就是打印日志并返回收到的字符串 public class EchoServerHandler : ChannelHandlerAdapter //管道处理基类较常用    {//  重写基类的方法当消息到达时触发这里收到消息后在控制台输出收到的内容并原样返回了客户端        public override void ChannelRead(IChannelHandlerContext context, object message)        {            var buffer message as IByteBuffer;            if (buffer ! null)            {                Console.WriteLine(Received from client: buffer.ToString(Encoding.UTF8));            }            context.WriteAsync(message);//写入输出流        }// 输出到客户端也可以在上面的方法中直接调用WriteAndFlushAsync方法直接输出        public override void ChannelReadComplete(IChannelHandlerContext context) context.Flush();//捕获 异常并输出到控制台后断开链接提示客户端意外断开链接也会触发        public override void ExceptionCaught(IChannelHandlerContext context, Exception exception)        {            Console.WriteLine(Exception: exception);            context.CloseAsync();        }    }2.2 Echo Client客户端的代码和服务端的代码相差很少体现了Netty统一的编程模型。有几个不同点客户端的Bootstrap不是ServerBootstrap了客户端不需要主线程组只有工作线程组消息处理管道也建立在里主线程工作组的拦截通道上。最后不是bind而是connectstatic async Task RunClientAsync()        {            ExampleHelper.SetConsoleLogger();                     var group new MultithreadEventLoopGroup();            X509Certificate2 cert null;            string targetHost null;            if (ClientSettings.IsSsl)            {                cert new X509Certificate2(Path.Combine(ExampleHelper.ProcessDirectory, dotnetty.com.pfx), password);                targetHost cert.GetNameInfo(X509NameType.DnsName, false);            }                              try            {                                 var bootstrap new Bootstrap();                bootstrap                    .Group(group)                    .ChannelTcpSocketChannel()                    .Option(ChannelOption.TcpNodelay, true)                    .Handler(new ActionChannelInitializerISocketChannel(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());                    }));                IChannel clientChannel await bootstrap.ConnectAsync(new IPEndPoint(ClientSettings.Host, ClientSettings.Port));                Console.ReadLine();                await clientChannel.CloseAsync();            }            finally            {                await group.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1));            }        }业务代码// 代码和服务端也相差不多并且继承了同样的基类。 public class EchoClientHandler : ChannelHandlerAdapter    {           readonly IByteBuffer initialMessage;        public EchoClientHandler()        {            this.initialMessage Unpooled.Buffer(ClientSettings.Size);            byte[] messageBytes Encoding.UTF8.GetBytes(Hello world);            this.initialMessage.WriteBytes(messageBytes);        }    //重写基类方法当链接上服务器后马上发送Hello World消息到服务端        public override void ChannelActive(IChannelHandlerContext context) context.WriteAndFlushAsync(this.initialMessage);        public override void ChannelRead(IChannelHandlerContext context, object message)        {            var byteBuffer message as IByteBuffer;            if (byteBuffer ! null)            {                Console.WriteLine(Received from server: byteBuffer.ToString(Encoding.UTF8));            }            context.WriteAsync(message);        }        public override void ChannelReadComplete(IChannelHandlerContext context) context.Flush();        public override void ExceptionCaught(IChannelHandlerContext context, Exception exception)        {            Console.WriteLine(Exception: exception);            context.CloseAsync();        }    }0x03 常用Handler和基类从Echo服务的例子中我们可以看到Netty程序不管时服务端还是客户端都通过一个Bootstrap/ServerBootstrap来启动Socket程序并通过设置处理Handler管道来处理出入的消息管道中常见的拦截器有加解密日志记录编解码消息头处理业务处理等实际业务中根据情况可以自行添加自己的业务逻辑同时很多处理器代码在服务端和客户端是公用的Netty本身已经提供了一些常用处理器和业务处理器的基类来简化实际开发我们一起看一下3.1 TlsHandlerNetty支持Tls加密传输TlsHandler类可以在开发人员无须关心加密传输时字节码的变化只关心自己的业务代码即可。在管道处理的第一个配置该类即可3.2 LengthFieldPrepender这个handler 会在实际发送前在将数据的长度放置在数据前本例中使用2个字节来存储数据的长度。3.3 LengthFieldBasedFrameDecoder这个handler比较常用会在解码前用于解析数据用于读取数据包的头信息特别是包长并等待数据达到包长后再交由下一个handler处理。参数说明 以下是Amp协议的参数值并注释了意义InitialBytesToStrip 0, //读取时需要跳过的字节数LengthAdjustment -5, //包实际长度的纠正如果包长包括包头和包体则要减去Length之前的部分LengthFieldLength 4, //长度字段的字节数 整型为4个字节LengthFieldOffset 1, //长度属性的起始偏移位MaxFrameLength int.MaxValue, // 最大包长3.4 ChannelHandlerAdapter和SimpleChannelInboundHandler业务处理的常用Handler基类一般客户端和服务端的业务处理handler 都要继承这个这两个类其中SimpleChannelInboundHandler是ChannelHandlerAdapter的子类对其简单的进行封装并进行了类型检查。3.5 IdleStateHandler 链接状态检查handler这个handler一般用于检查链接的状态比如写超时读超时。在实际项目中一般在客户端添加它并用于发送心跳包。以下是DotBPE在客户端管道中 第一个添加IdleStateHandler 并设置触发时间 var bootstrap new Bootstrap();bootstrap.ChannelTcpSocketChannel().Option(ChannelOption.TcpNodelay, true).Option(ChannelOption.ConnectTimeout, TimeSpan.FromSeconds(3)).Group(new MultithreadEventLoopGroup())                .Handler(new ActionChannelInitializerISocketChannel(c                {                    var pipeline c.Pipeline;                    pipeline.AddLast(new LoggingHandler(CLT-CONN));                    MessageMeta meta _msgCodecs.GetMessageMeta();                    // IdleStateHandler                    pipeline.AddLast(timeout, new IdleStateHandler(0, 0, meta.HeartbeatInterval / 1000));                    //消息前处理                    pipeline.AddLast(                        new LengthFieldBasedFrameDecoder(                            meta.MaxFrameLength,                            meta.LengthFieldOffset,                            meta.LengthFieldLength,                            meta.LengthAdjustment,                            meta.InitialBytesToStrip                        )                    );                    pipeline.AddLast(new ChannelDecodeHandlerTMessage(_msgCodecs));                    pipeline.AddLast(new ClientChannelHandlerAdapterTMessage(this));                }));            return bootstrap;然后在业务处理handler中处理UserEventTriggered事件//ChannelHandlerAdapter 重写UserEventTriggeredpublic override void UserEventTriggered(IChannelHandlerContext context, object evt){  if(evt is IdleStateEvent){     var eventState evt as IdleStateEvent;     if(eventState !null){        this._bootstrap.SendHeartbeatAsync(context,eventState);     }  } }更多细节可以参考 《Netty 4.x 用户指南》相关文章 使用DotNetty编写跨平台网络通信程序Unity/DotNetty中集成Lidgren实现可靠UDPSuperSocket与Netty之实现protobuf协议包括服务端和客户端原文地址http://www.cnblogs.com/MuNet/p/8546309.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com
http://wiki.neutronadmin.com/news/283878/

相关文章:

  • 电商扶贫网站建设手机排行榜前十名
  • 安阳网站建设价格丹阳官方网站建站
  • 备案期间怎么访问网站企业建立网站需要
  • wordpress站点前台请求数过多wordpress 外贸 开发
  • 酒店建设网站的意义超酷网站
  • 有没有代做模型的网站大数据营销精准营销
  • 杭州网站推广优化公司免费的短视频app大全下载
  • 游戏网站服务器租用淘词神器
  • 网站后台口令网页的后台管理系统
  • 泽成seo网站排名963中华室内设计网
  • 网站制作公司网站源码群晖wordpress性能
  • 制作网站建设的公司简单个人网站模板
  • 做本地分类信息网站赚钱吗图书网站开发介绍
  • 优秀企业网站欣赏wordpress 站内链接
  • 怎样给网站做国内网站建设的趋势是怎样的
  • 360搜索怎么做网站自然优化如何给网站增加内链
  • 如何在国外社交网站上做原单外贸大多数软件仍然是定制开发的
  • 手机端快速建站工具旅游公共信息服务网站建设及服务质量标准
  • html网站模板免费网站后台用什么开发
  • 网站解决方案设计企业网站建设费用入什么科目
  • 做电影网站涉及的侵权问题网站建设现在什么服务器比较好
  • 网站建设百度知道安卓编程软件
  • 网站建设合同 技术合同域名是不是网址的地址
  • 建材 东莞网站建设谁有做爰网站号
  • 黄村专业网站开发公司深圳58网站建设
  • 网站联盟的收益模式同国外做贸易的网站
  • 大学网站建设的意义05网答案大全
  • 2008系统怎么做网站景观设计公司名称
  • 适合大学生做兼职的网站有哪些网页生成二维码生成器
  • nas做流媒体网站某某网站建设策划书2000字