模板解析“Json”数据适配器
定义
命名空间:TouchSocket.Core
程序集:TouchSocket.Core.dll
一、说明
Json适配器,一般用于Json字符串类的消息。可以直接通过Json串解析出对应的数据协议。
二、特点
- 可以自由适配很多的字符串数据协议。
- 可以与任意语言、框架对接数据。
三、使用
客户端与服务器均适用。下列以服务器为例。
步骤
- 声明新建类,实现IRequestInfo接口,此对象即为 存储数据的实体类,可在此类中声明一些属性,以备使用。
- 声明新建类,继承CustomJsonDataHandlingAdapter,并且以步骤1声明的类作为泛型。并实现对应抽象方法。
- TouchSocketConfig配置中设置。
- 通过Received(事件、方法、插件)中的RequestInfo对象,强转为步骤1声明的类型,然后读取其属性值,以备使用。
【MyJsonClass】
首先,新建MyJsonClass类,此类并未限制任何接口,仅仅是规范投递。在实际使用时可以根据实际情况声明一些属性或方法以备使用。
下列示例仅保存数据体。
class MyJsonClass : IRequestInfo
{
public MyJsonClass(JsonPackageKind packageKind, Encoding encoding, ReadOnlyMemory<byte> dataMemory, ReadOnlyMemory<byte> impurityMemory)
{
this.PackageKind = packageKind;
this.Encoding = encoding;
this.DataMemory = dataMemory;
this.ImpurityMemory = impurityMemory;
}
public JsonPackageKind PackageKind { get; }
public Encoding Encoding { get; }
public ReadOnlyMemory<byte> DataMemory { get; }
public ReadOnlyMemory<byte> ImpurityMemory { get; }
}
新建MyMyCustomJsonDataHandlingAdapter继承MyCustomJsonDataHandlingAdapter,然后对构造函数的编码作出赋值。
class MyCustomJsonDataHandlingAdapter : CustomJsonDataHandlingAdapter<MyJsonClass>
{
public MyCustomJsonDataHandlingAdapter() : base(Encoding.UTF8)
{
}
protected override MyJsonClass GetInstance(JsonPackageKind packageKind, Encoding encoding, ReadOnlyMemory<byte> dataMemory, ReadOnlyMemory<byte> impurityMemory)
{
return new MyJsonClass(packageKind,encoding,dataMemory,impurityMemory);
}
}
【接收】
private static async Task<TcpClient> CreateClient()
{
var client = new TcpClient();
//载入配置
await client.SetupAsync(new TouchSocketConfig()
.SetRemoteIPHost("127.0.0.1:7789")
.SetTcpDataHandlingAdapter(() => new MyCustomJsonDataHandlingAdapter())
.ConfigureContainer(a =>
{
a.AddConsoleLogger();//添加一个日志注入
}));
await client.ConnectAsync();//调用连接,当连接不成功时,会抛出异常。
client.Logger.Info("客户端成功连接");
return client;
}
private static async Task<TcpService> CreateService()
{
var service = new TcpService();
service.Received = (client, e) =>
{
//从客户端收到信息
if (e.RequestInfo is MyJsonClass myRequest)
{
client.Logger.Info($"已从{client.Id}接收到:PackageKind={myRequest.PackageKind},消息={Encoding.UTF8.GetString(myRequest.DataMemory.Span)}");
}
return Task.CompletedTask;
};
await service.SetupAsync(new TouchSocketConfig()//载入配置
.SetListenIPHosts("tcp://127.0.0.1:7789", 7790)//同时监听两个地址
.SetTcpDataHandlingAdapter(() => new MyCustomJsonDataHandlingAdapter())
.ConfigureContainer(a =>
{
a.AddConsoleLogger();//添加一个控制台日志注入(注意:在maui中控制台日志不可用)
})
.ConfigurePlugins(a =>
{
//a.Add();//此处可以添加插件
}));
await service.StartAsync();//启动
service.Logger.Info("服务器已启动");
return service;
}
提示
上述创建的适配器客户端与服务器均适用。
四、适配器纠错
该适配器当收到半包数据时,会自动缓存半包数据,然后等后续数据收到以后执行拼接操作。
但有的时候,可能由于其他原因导致后续数据错乱,这时候就需要纠错。详情可看适配器纠错