【网络通讯】【DotNetty实现(四)】

网络通讯系列

第五章 【网络通讯】【详细场景下的Demo示例(五)】
第四章 【网络通讯】【DotNetty实现(四)】
第三章 【网络通讯】【SuperSocket实现(三)】
第二章 【网络通讯】【Socket实现(二)】
第一章 【网络通讯】【通讯协议(一)】



前言

介绍使用DotNetty实现网络通讯。


一、程序设计

使用第三方库DotNetty来实现上位机客户端。
官网:https://github.com/Azure/DotNetty/
可下载源码(如果无法登上github下载,可在评论区留言,有需要我再上传源码资料)

关键字:高性能、易用性

DotNetty的整体架构可以分为以下四个部分:

Channel:通道是业务逻辑和网络逻辑之间的桥梁。在DotNetty中,所有的网络数据都通过Channel来进行传输。

EventLoop:事件循环是一个单独的线程,用来处理特定类型的事件。每个EventLoop都会绑定一个Selector,用于监听Channel中感兴趣的事件。当事件发生时,该EventLoop会被唤醒来处理该事件。

ChannelPipeline:通道管道是一系列的处理器链,用于处理输入和输出的数据流。在DotNetty中,所有的数据都经过这个管道,在这个管道上可以添加多个处理器来实现业务逻辑。

ChannelHandlerContext:通道处理器上下文包含了当前通道的所有状态信息,每个ChannelHandlerContext都与一个EventLoop相关联。在处理业务逻辑时,可以通过ChannelHandlerContext来发送数据、获取当前通道的状态等。

在DotNetty中,还有许多组件模块,其中比较重要的有:

Transport:传输层模块,用于处理不同协议的网络连接。

Codec:编解码模块,用于处理消息的编码和解码。

Handler:处理器模块,用于实现具体的业务逻辑。

Bootstrap:启动器模块,用于配置和启动应用程序。

怎么选择架构和组件呢?需要回顾第一章,了解我们的需求是什么?
接收的是16进制字节、前面2个字节是接收内容的长度,协议规定一条指令最大1Kb即1024字节,我们可以通道Bootstrap来配置这个解析的规则,然后通过通道ChannelHandlerContext与EventLoop相关联实现接收数据,通过Channel实现数据发送。

在这里我们用到的是
要实现客户端,我们需要设计三个接口、一个事件、两个类
接口分别是连接服务器、断连服务器、发送服务器内容;
事件是接收服务器内容事件;
实现类分为两个,
一个是用于接收内容的通道类;
一个是实现接口和事件内容的客户端类,包含解析规则。

后续优化,在客户端中实现对连接多个服务器需要有多个客户端的管理、解决连接不存在IP的服务器时时间过长问题(Ping功能)等等,这个会在第五章中的Demo实例中有完整解决方案资源可下载。

二、代码

需要添加的NuGet程序包是:

<PackageReference Include="DotNetty.Handlers" Version="0.7.6" />

通道处理类

/// <summary>
/// Tcp通道处理
/// </summary>
internal class TcpChannelHandler : SimpleChannelInboundHandler<object>
{
   
   
    private TcpSocketClient tcpSocketClient;

    /// <summary>
    /// Tcp
    /// </summary>
    /// <param name="client">client</param>
    public TcpChannelHandler(TcpSocketClient client) 
    {
   
   
        tcpSocketClient = client;
    }

    /// <summary>
    /// 通道连接后调用
    /// </summary>
    /// <param name="context">上下文</param>
    public override void ChannelActive(IChannelHandlerContext context)
    {
   
   
        tcpSocketClient.Client = context.Channel.Id.AsShortText();
        tcpSocketClient.Connected = true;
    }

    /// <summary>
    /// 通道读取完成
    /// </summary>
    /// <param name="context">上下文</param>
    public override void ChannelReadComplete(IChannelHandlerContext context)
    {
   
   
        context.Flush();
    }

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值