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 网 ...
随机推荐
- java缓存技术(转)
最近在做java缓存,了解了一下.以下仅是对map对方式讨论.没有对点阵图阵讨论.作缓存要做以下2点: 1:清理及更新缓存时机的处理: . 虚拟机内存不足,清理缓存 .. 缓存时间超时,或访问 ...
- JS数组学习笔记
原文:JS数组学习笔记 最近在备课数组,发现很多ES5的方法平时很少用到.细节比较多,自己做了大量例子和整理,希望对大家了解JavaScript中的Array有所帮助. 概念 数组是值的有序集合.每个 ...
- 用C#绘图实现动画出现卡屏(运行慢)问题的解决办法
原文:用C#绘图实现动画出现卡屏(运行慢)问题的解决办法 正在用C#做一个小游戏,需要用到动画,上次解决的问题是闪烁问题,用双缓冲技术.以为不会有什么问题了.后来当把图片全部绘制上去的时候依然出现了卡 ...
- 图片 Base64码 转换
import sun.misc.BASE64Decoder; private String getBase64Picture(String imgBase64Str) { FileOutputStre ...
- Javascript学习6 - 类、对象、继承
原文:Javascript学习6 - 类.对象.继承 Javasciprt并不像C++一样支持真正的类,也不是用class关键字来定义类.Javascript定义类也是使用function关键字来完成 ...
- 自定义Data Service Providers
自定义Data Service Providers 作者:AlexJ 翻译:谈少民 原文链接:http://blogs.msdn.com/b/alexj/archive/2010/01/07/data ...
- .net Framework各个版本之间的发展
原文:.net Framework各个版本之间的发展 上个星期看到了.NET 4.0框架退休日期逐渐临近文章,发现自己一直在使用NET FrameWork,身为一个NET程序员,里面大概的区别自己还 ...
- POJ 2586 Y2K Accounting Bug(枚举洪水问题)
Y2K Accounting Bug Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10674 Accepted: 53 ...
- Java设计模式(三)原型模型 适配器型号
(五岁以下儿童)原型模型 Prototype 样机模型旨在复制一个现有对象来创建新对象.而不是通过的方式的实例.原型模式须要实现 Cloneable 接口.覆写clone方法,复制分为浅复制.深复制. ...
- Arcgis For Android之GPS定位实现
翻开曾经做的东西,看了看,非常多从逻辑上比較乱,对之做了改动,完毕后实现的效果为: MapActivity源码例如以下: package com.lzugis.map; import java.io. ...