C# 通讯网关开发
楼主从12年毕业大部分时间一直从事于通讯网关的开发,刚刚学那会连C#是啥都不知道,就直接入手网关开发,前前后后到现在也算是弄了5、6个通讯协议,后来看到北风之神的socket框架和supersocket也是研究了很久,就在想着去自己搭建一个通讯网关框架。
框架概述
这个框架原形当然是微软的高性能服务器框架,其中封装了一些业务逻辑等处理。
网络层

1 /// <summary>
2 /// 服务接口
3 /// </summary>
4 public interface IServer
5 {
6 string Name { get; }
7 void Start(int port);
8 void Start(EndPoint localPoint);
9 void Stop();
10 }


/// <summary>
/// 请求接口
/// </summary>
public interface IRequestInfo
{
/// <summary>
/// 唯一编号
/// </summary>
string Key { get; set; }
}

每种协议都有特定的格式,这个类就就是按特定命令格式生成的请求

1 /// <summary>
2 /// 消息过滤器
3 /// </summary>
4 /// <typeparam name="TRequestInfo">请求接口</typeparam>
5 public interface IReceiveFilter<TRequestInfo>
6 where TRequestInfo : IRequestInfo
7 {
8 /// <summary>
9 /// 消息解析
10 /// </summary>
11 /// <param name="message"></param>
12 /// <returns></returns>
13 List<TRequestInfo> Filter(ref byte[] message);
14 }

消息的过滤器,处理tcp连接中的粘包断包等问题

1 /// <summary>
2 /// 网关接口
3 /// </summary>
4 /// <typeparam name="TRequestInfo">请求数据</typeparam>
5 /// <typeparam name="TReceiveFilter">消息过滤器</typeparam>
6 /// <typeparam name="TCommandFactory">命令工厂</typeparam>
7 public interface IGater<TRequestInfo, TReceiveFilter, out TCommandFactory>
8 where TRequestInfo : IRequestInfo
9 where TReceiveFilter : IReceiveFilter<TRequestInfo>
10 {
11 /// <summary>
12 /// 配置
13 /// </summary>
14 BaseConfig Config { get; }
15 /// <summary>
16 /// 命令工厂
17 /// </summary>
18 TCommandFactory CommandFactory { get; }
19 /// <summary>
20 /// 服务程序
21 /// </summary>
22 TcpServer<TReceiveFilter, TRequestInfo> Server { get; }
23 }

网关接口层

1 /// <summary>
2 /// 基础网关
3 /// </summary>
4 /// <typeparam name="TRequestInfo">请求数据接口</typeparam>
5 /// <typeparam name="TCommand">客户端命令接口</typeparam>
6 /// <typeparam name="TReceiveFilter">消息过滤器接口</typeparam>
7 /// <typeparam name="TCommandFactory">客户端命令解析工厂</typeparam>
8 public abstract class BaseGate<TRequestInfo, TCommand, TReceiveFilter, TCommandFactory> : IGater<TRequestInfo, TReceiveFilter, TCommandFactory>
9 where TRequestInfo : IRequestInfo
10 where TCommand : ICommand<TRequestInfo>
11 where TReceiveFilter : IReceiveFilter<TRequestInfo>, new()
12 where TCommandFactory : ICommandFactory<TRequestInfo, TCommand>
13 {
14 /// <summary>
15 /// 配置
16 /// </summary>
17 public BaseConfig Config { get; private set; }
18 /// <summary>
19 /// 命令工厂
20 /// </summary>
21 public TCommandFactory CommandFactory { get; private set; }
22 /// <summary>
23 /// 服务
24 /// </summary>
25 public TcpServer<TReceiveFilter, TRequestInfo> Server { get; private set; }
26
27 /// <summary>
28 /// 构造函数
29 /// </summary>
30 /// <param name="server">socekt服务</param>
31 /// <param name="commandFactory">命令工厂</param>
32 /// <param name="config">服务配置</param>
33 /// <param name="clientEvent">客户端事件处理</param>
34 protected BaseGate(TcpServer<TReceiveFilter, TRequestInfo> server, TCommandFactory commandFactory, BaseConfig config, IClientEvent clientEvent)
35 {
36 CommandFactory = commandFactory;
37 Server = server;
38 Config = config;
39 server.ClientOnClosed += clientEvent.ClientOnClosed;
40 server.ClientOnConnected += clientEvent.ClientOnConnected;
41 server.ReceiveNewData += ReceiveNewData;
42 }
43
44 /// <summary>
45 /// 新数据处理
46 /// </summary>
47 /// <param name="request"></param>
48 private void ReceiveNewData(TRequestInfo request)
49 {
50 var item = CommandFactory.CreateCommand(request);
51 if (item != null)
52 {
53 item.ExcuteCommand(request);
54 }
55 }
56
57 /// <summary>
58 /// 初始化网关
59 /// </summary>
60 public void Init()
61 {
62
63 Server.Init(Config.MaxClientCounts, Config.BufferSize);
64 Server.InitFilter(new TReceiveFilter());
65 }
66 /// <summary>
67 /// 启动网关
68 /// </summary>
69 public void Start()
70 {
71 Server.Start(Config.Port);
72 }
73 }

网关的基本实现

1 /// <summary>
2 /// 客户端连接处理接口
3 /// </summary>
4 public interface IClientEvent
5 {
6 /// <summary>
7 /// 新连接
8 /// </summary>
9 /// <param name="sender"></param>
10 /// <param name="e"></param>
11 void ClientOnConnected(object sender, ClientEventArgs e);
12 /// <summary>
13 /// 连接断开
14 /// </summary>
15 /// <param name="sender"></param>
16 /// <param name="e"></param>
17 void ClientOnClosed(object sender, ClientEventArgs e);
18 }

这个是客户端的连接处理,是根据requestinfo中key来标识唯一id,也可以在网关中实现,我是单独摘开的,因为可能架构多个服务器的话,多种协议
业务逻辑层
这里其实是封装了命令的处理,提供工厂接口以及命令接口,根据request请求生成

1 /// <summary>
2 /// 命令接口
3 /// </summary>
4 /// <typeparam name="TRequestInfo">请求接口</typeparam>
5 public interface ICommand<in TRequestInfo>
6 where TRequestInfo : IRequestInfo
7 {
8 /// <summary>
9 /// 客户端标识
10 /// </summary>
11 string Key { get; set; }
12 /// <summary>
13 /// 执行命令
14 /// </summary>
15 /// <param name="request"></param>
16 void ExcuteCommand(TRequestInfo request);
17 }


1 /// <summary>
2 /// 客户端命令工厂
3 /// </summary>
4 /// <typeparam name="TRequestInfo">请求接口</typeparam>
5 /// <typeparam name="TCommand">命令接口</typeparam>
6 public interface ICommandFactory<in TRequestInfo, out TCommand>
7 where TRequestInfo : IRequestInfo
8 where TCommand : ICommand<TRequestInfo>
9 {
10 /// <summary>
11 /// 构造命令
12 /// </summary>
13 /// <param name="request"></param>
14 /// <returns></returns>
15 TCommand CreateCommand(TRequestInfo request);
16 }

大家只要继承上面的接口,基本就可以实现了。
这是下载地址,大家都看看,顺便给点意见
C# 通讯网关开发的更多相关文章
- 《连载 | 物联网框架ServerSuperIO教程》- 5.轮询通讯模式开发及注意事项。附:网友制作的类库说明(CHM)
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》- 6.并发通讯模式开发及注意事项
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》- 7.自控通讯模式开发及注意事项
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》- 8.单例通讯模式开发及注意事项
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 串口屏Modbus协议,串口屏的modbus协议资料,串口屏modbus通讯协议开发,串口屏之modbus协议使用技巧
串口屏Modbus协议,串口屏的modbus协议资料,串口屏modbus通讯协议开发,串口屏之modbus协议使用技巧 本例程中用51单片机作为Modbus从机,从机的设备地址为2,从机有4个寄存器, ...
- Android IOS WebRTC 音视频开发总结(六二)-- 大数据解密国外实时通讯行业开发现状
本文主要介绍国外实时通讯行业现状,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 上篇文章我们采用百度搜索指数来分 ...
- Android IOS WebRTC 音视频开发总结(六一)-- 大数据解密国内实时通讯行业开发现状
本文主要介绍国内实时通讯行业现状,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 这几年移动互联网发展势头很猛,与 ...
- HslCommunication库的二次协议扩展,适配第三方通讯协议开发,基础框架支持长短连接模式
本文将使用一个gitHub开源的项目来扩展实现二次协议的开发,该项目已经搭建好了基础层架构,并实现了三菱,西门子,欧姆龙,MODBUS-TCP的通讯示例,也可以参照这些示例开发其他的通讯协议,并Pul ...
- 物联网网关开发:基于MQTT消息总线的设计过程(上)
道哥的第 021 篇原创 目录 一.前言 二.网关的作用 2.1 指令转发 2.2 外网通信 2.3 协议转换 2.4 设备管理 2.5 边沿计算(自动化控制) 三.网关内部进程之间的通信 3.1 网 ...
随机推荐
- HDU 1198 Farm Irrigation (并检查集合 和 dfs两种实现)
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- React学习系列
React学习系列 系列学习react 翻译地址 https://scotch.io/tutorials/learning-react-getting-started-and-concepts 我是初 ...
- 用C#绘图实现动画出现卡屏(运行慢)问题的解决办法
原文:用C#绘图实现动画出现卡屏(运行慢)问题的解决办法 正在用C#做一个小游戏,需要用到动画,上次解决的问题是闪烁问题,用双缓冲技术.以为不会有什么问题了.后来当把图片全部绘制上去的时候依然出现了卡 ...
- android该系统的应用API选择演示版本
转载请注明出处[http://blog.csdn.net/y150481863/article/details/41280045] 首先我们在开发一个应用之前,特别是一个android应用.首先要考虑 ...
- document.domain跨域
原文:[转载]document.domain跨域 document.domain 用来得到当前网页的域名. 比如在地址栏里输入: javascript:alert(document.domain); ...
- Java得到的一周的最后一天的一段时间内
Java得到的一周的最后一天的一段时间内 1.设计源代码 LastDayOfWeek.java: /** * @Title:LastDayOfWeek.java * @Package:com.you. ...
- HDU 2616 Kill the monster (暴力搜索 || 终极全阵列暴力)
主题链接:HDU 2616 Kill the monster 意甲冠军:有N技能比赛HP有M怪物,技能(A,M),能伤害为A.当怪兽HP<=M时伤害为2*A. 求打死怪兽(HP<=0)用的 ...
- centos6.5 x86_64安装oracle 11.2.0.3grid
centos6.5 x86_64安装oracle 11.2.0.3grid 1.安装前的准备 工作 1.1.配置node1 1.1.1.配置虚拟机并安装centos 安装node1----- 1 ...
- Redis MSET的极限在哪里
·背景 Redis以"快.准.狠"而著称,除了其主-从模式略失光彩(主从模式更多是被以讹传讹,3.0依旧在测试中),大部分的应用可谓尖兵利器.在一些常规写的时候,MSET和HMSE ...
- Front End Books
Front End Books 记录和推荐一些认为还不错的前端方面的书籍.列入标准: 看过,并觉得值得推荐给大家的. 正在看的,已经觉得不错的,或者听闻别人说不错的. 打算看的,经多人推荐,一致认为必 ...