网络通讯系列
第五章 【网络通讯】【详细场景下的Demo示例(五)】
第四章 【网络通讯】【DotNetty实现(四)】
第三章 【网络通讯】【SuperSocket实现(三)】
第二章 【网络通讯】【Socket实现(二)】
第一章 【网络通讯】【通讯协议(一)】
前言
介绍使用SuperSocket实现网络通讯。
一、程序设计
使用第三方库SuperSocket来实现上位机客户端。
官网:https://www.supersocket.net/
主要介绍如图:

关键字:高性能、简单易用
SuperSocket内置的常用协议实现模版有以下几个:
- TerminatorReceiveFilter (SuperSocket.SocketBase.Protocol.TerminatorReceiveFilter, SuperSocket.SocketBase)
结束符协议 - CountSpliterReceiveFilter (SuperSocket.Facility.Protocol.CountSpliterReceiveFilter, SuperSocket.Facility)
固定数量分隔符协议 - FixedSizeReceiveFilter (SuperSocket.Facility.Protocol.FixedSizeReceiveFilter, SuperSocket.Facility)
固定请求大小的协议 - BeginEndMarkReceiveFilter (SuperSocket.Facility.Protocol.BeginEndMarkReceiveFilter, SuperSocket.Facility)
带起止符的协议 - FixedHeaderReceiveFilter (SuperSocket.Facility.Protocol.FixedHeaderReceiveFilter, SuperSocket.Facility)
头部格式固定并且包含内容长度的协议
怎么选择哪一个协议?需要回顾第一章,了解我们的需求是什么?
接收的是16进制字节、前面2个字节是接收内容的长度,因此我们使用头部格式固定并且包含内容长度的协议
上位机作为服务器,因此我们使用SuperSocket.ClientEngine.EasyClient客户端对象
在这里我们用到的是
要实现客户端,我们需要设计三个接口、三个事件、三个类
接口分别是连接服务器、断连服务器、发送服务器内容;
事件分别是接收服务器内容事件、连接成功事件、断开连接事件;
实现类分为三个,
一个是使用头部格式固定并且包含内容长度的协议的协议解析收到内容的解析类;
一个是解析需要用到的原始数据包信息实体类;
一个是实现接口和事件内容的功能类。
后续优化,在客户端中实现对连接多个服务器需要有多个客户端的管理、解决连接不存在IP的服务器时时间过长问题(Ping功能)等等,这个会在第五章中的Demo实例中有完整解决方案资源可下载。
二、代码
需要添加的NuGet程序包是:
<PackageReference Include="SuperSocket.ClientEngine" Version="0.10.0" />
<PackageReference Include="SuperSocket.ProtoBase" Version="1.7.0.17" />
实体类:
/// <summary>
/// 原始数据包信息
/// </summary>
public class PackageInfo : SuperSocket.ProtoBase.IPackageInfo
{
/// <summary>
/// 数据
/// </summary>
public byte[] Buffers {
get; }
/// <summary>
/// 长度
/// </summary>
public int Length {
get; }
/// <summary>
/// 客户端
/// </summary>
public SuperSocket.ClientEngine.EasyClient Client {
get; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="length">长度</param>
/// <param name="client">客户端</param>
public PackageInfo(int length, SuperSocket.ClientEngine.EasyClient client)
{
Length = length;
Buffers = new byte[length];
Client = client;
}
}
解析类:
/// <summary>
/// 长度过滤器
/// </summary>
public class LengthReceiveFilter : SuperSocket.ProtoBase.FixedHeaderReceiveFilter<PackageInfo>
{
private SuperSocket.ClientEngine.EasyClient _client;
/// <summary>
/// 构造
/// </summary>
/// <param name="client">客户端</param>
public LengthReceiveFilter(SuperSocket

最低0.47元/天 解锁文章
3454

被折叠的 条评论
为什么被折叠?



