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 网 ...
随机推荐
- DDD Reference
版权声明:本文博客原创文章.博客,未经同意,不得转载.
- javaEE异常摘要——更换工作区相同tomcat当部署在同一个项目疑难解答
我有一个项目,我的工作区公告,没问题,它可以运行正常,但我把项目copy还有一个工作空间,然后发布到tomcat(随着tomcat,先前的工作空间remove deployment,公布信息)上去,想 ...
- Python开发一个csv比较功能相关知识点汇总及demo
Python 2.7 csv.reader(csvfile, dialect='excel', **fmtparams)的一个坑:csvfile被csv.reader生成的iterator,在遍历每二 ...
- 流动python - 写port扫描仪和各种并发尝试(多线程/多进程/gevent/futures)
port扫描仪的原理非常easy.没有什么比操作更socket,能够connect它认为,port打开. import socket def scan(port): s = socket.socket ...
- [cocos2dx注意事项009]试用quick-cocos2dx-2.2.4
quick-cocos2d-x 在中国站http://quick.cocoachina.com/?page_id=40,用他们自己的话说:quick-cocos2d-x(后文简称 quick)与 co ...
- android EditText问题多行文本输入
一旦习惯了网络和swing在文本框输入,我们Android突然缺乏这样的管制,刚开始使用它是相当费力.为了要实现多行文本输入框和显示.逐一克服这些问题,如下面: 1. 怎么做EditText显示区域在 ...
- httppost body的实现, 和body是gb2312等编码的实现
使用的是http4.X 版本,里面推荐使用的post是key value的形式 List<NameValuePair> formparams = new ArrayList<Name ...
- crawler_wireshark 过滤基础知识
一.IP过滤:包括来源IP或者目标IP等于某个IP比如:ip.src addr==192.168.0.208 or ip.src addr eq 192.168.0.208 显示来源IP ...
- ASP.NET的CMS
最受欢迎的ASP.NET的CMS下载 1. Umbraco 项目地址 | 下载 Umbraco是一个开放源码的CMS内容管理系统,基于asp.net建立,使用mssql进行存储数据. 使用Umbrac ...
- 矿Mac必备软件
1.Svn工具: Cornerstone_v2.7.10 2.iPhone配置文件管理 iPhoneConfigUtility.dmg 3.有道 for mac http://cidian.youda ...