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 }

大家只要继承上面的接口,基本就可以实现了。

这是下载地址,大家都看看,顺便给点意见

http://pan.baidu.com/s/1dDIOkyH

C# 通讯网关开发的更多相关文章

  1. 《连载 | 物联网框架ServerSuperIO教程》- 5.轮询通讯模式开发及注意事项。附:网友制作的类库说明(CHM)

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  2. 《连载 | 物联网框架ServerSuperIO教程》- 6.并发通讯模式开发及注意事项

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  3. 《连载 | 物联网框架ServerSuperIO教程》- 7.自控通讯模式开发及注意事项

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  4. 《连载 | 物联网框架ServerSuperIO教程》- 8.单例通讯模式开发及注意事项

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  5. 串口屏Modbus协议,串口屏的modbus协议资料,串口屏modbus通讯协议开发,串口屏之modbus协议使用技巧

    串口屏Modbus协议,串口屏的modbus协议资料,串口屏modbus通讯协议开发,串口屏之modbus协议使用技巧 本例程中用51单片机作为Modbus从机,从机的设备地址为2,从机有4个寄存器, ...

  6. Android IOS WebRTC 音视频开发总结(六二)-- 大数据解密国外实时通讯行业开发现状

    本文主要介绍国外实时通讯行业现状,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 上篇文章我们采用百度搜索指数来分 ...

  7. Android IOS WebRTC 音视频开发总结(六一)-- 大数据解密国内实时通讯行业开发现状

    本文主要介绍国内实时通讯行业现状,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 这几年移动互联网发展势头很猛,与 ...

  8. HslCommunication库的二次协议扩展,适配第三方通讯协议开发,基础框架支持长短连接模式

    本文将使用一个gitHub开源的项目来扩展实现二次协议的开发,该项目已经搭建好了基础层架构,并实现了三菱,西门子,欧姆龙,MODBUS-TCP的通讯示例,也可以参照这些示例开发其他的通讯协议,并Pul ...

  9. 物联网网关开发:基于MQTT消息总线的设计过程(上)

    道哥的第 021 篇原创 目录 一.前言 二.网关的作用 2.1 指令转发 2.2 外网通信 2.3 协议转换 2.4 设备管理 2.5 边沿计算(自动化控制) 三.网关内部进程之间的通信 3.1 网 ...

随机推荐

  1. 使用 Advanced Installer 打包 一键安装Web应用程序

    原文:使用 Advanced Installer 打包 一键安装Web应用程序 安装预览: 资源下载: 示例安装包 操作流程: 1.新建Asp.net Application. 2.设置应用程序名称和 ...

  2. Android项目打包成APK文件

    第一步:右键单击该项目选择Export项目 显演示样例如以下界面:选择Exprot Android Application 第二步:输入项目名称,默认的情况下是原始的项目名称 下一步: 点击 Crea ...

  3. Jquery 分页插件 Jquery Pagination

    Jquery 分页插件 Jquery Pagination 分页插件来说,我觉得适用就行,尽量简单然后能够根据不同的应用场景能够换肤.展现形式等. 对于初学者想写分页插件的同学,也可以看下源码,代码也 ...

  4. lua转让C++书面DLL达到“热更新”

    原创作品,请注明出处转载CSDN:http://blog.csdn.net/relar/article/details/38084689 开发游戏server往往有"热更新"的需求 ...

  5. linux Apache安装

    原文:linux Apache安装 1.       下载apache,http://httpd.apache.org/download.cgi  通过这个官方网站,我们可以下到最新的版本.现在版本都 ...

  6. thinkphp学习笔记7—多层MVC

    原文:thinkphp学习笔记7-多层MVC ThinkPHP支持多层设计. 1.模型层Model 使用多层目录结构和命名规范来设计多层的model,例如在项目设计中如果需要区分数据层,逻辑层,服务层 ...

  7. atcoder 它February 29th

    Time limit : 2sec / Stack limit : 256MB / Memory limit : 256MB Problem Charlie was born January 1st ...

  8. C++ Primer 学习笔记_56_ 类和数据抽象 --消息处理演示示例

    拷贝控制 --消息处理演示样例 说明: 有些类为了做一些工作须要对复制进行控制. 为了给出这种样例,我们将概略定义两个类,这两个类可用于邮件处理应用程序.Message类和 Folder类分别表示电子 ...

  9. CodeForces 425E Sereja and Sets

    意甲冠军: 集S它包括了很多间隔[l,r]  和1<=l<=r<=n  f(S)个不相交的区间  问给出n和f(S)  有几种可能的S集合 思路: dp好题  至于为啥是dp-  我 ...

  10. monkey命令详解

    标准的monkey 命令 adb shell monkey [options] <eventcount> 例如: adb shell monkey -v    产生500次随机事件,作用在 ...