一、说明
1.1 为什么需要?
有时候物联网设备管理平台需要接收不同厂家的物联网设备,每家的设备通讯协议各不相同。平台需要为每个厂商提供一个通讯端口。所以需要实现一个端口,对应一个数据解析器。
1.2 为什么不创建多个Server?
- 难管理。
- 多个Server之间数据互通就变得很麻烦
1.3 为什么不用同一个端口?
当同一个端口解析不同协议时,就需要协议侦测,举个例子说,你想用一个吸管去知道四个杯子里都是什么的时候,你只有一个一个去尝,所以这样的设计性能低下,且并不可靠,甚至会导致严重的偶发性bug。所以最好最好不要这样设计。
二、程序集源码
2.1 源码位置
2.2 说明文档
三、安装
Nuget安装TouchSocket
即可,具体步骤详看链接博客。
四、声明插件类
/// <summary>
/// 此插件实现,按照不同端口,使用不同适配器。
/// <list type="bullet">
/// <item>7789端口:使用"**"结尾的数据</item>
/// <item>7790端口:使用"##"结尾的数据</item>
/// </list>
/// </summary>
class DifferentProtocolPlugin : TcpPluginBase<ISocketClient>
{
protected override void OnConnecting(ISocketClient client, ClientOperationEventArgs e)
{
if (client.ServicePort == 7789)
{
client.SetDataHandlingAdapter(new TerminatorPackageAdapter("**"));
}
else
{
client.SetDataHandlingAdapter(new TerminatorPackageAdapter("##"));
}
base.OnConnecting(client, e);
}
protected override void OnReceivedData(ISocketClient client, ReceivedDataEventArgs e)
{
//如果是自定义适配器,此处解析时,可以判断e.RequestInfo的类型
client.Logger.Info($"{client.GetInfo()}收到数据,服务器端口:{client.ServicePort},数据:{e.ByteBlock}");
base.OnReceivedData(client, e);
}
}
五、创建服务器
static void Main(string[] args)
{
TcpService service = new TcpService();
service.Setup(new TouchSocketConfig()//载入配置
.UsePlugin()
.SetListenIPHosts(new IPHost[] { new IPHost("tcp://127.0.0.1:7789"), new IPHost(7790) })//同时监听两个地址
.ConfigureContainer(a =>//容器的配置顺序应该在最前面
{
a.AddConsoleLogger();//添加一个控制台日志注入(注意:在maui中控制台日志不可用)
})
.ConfigurePlugins(a =>
{
a.Add<DifferentProtocolPlugin>();
}))
.Start();//启动
service.Logger.Info("服务器成功启动");
Console.ReadKey();
}
本文示例demo