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# 通讯网关开发

时间: 2024-08-10 13:43:35

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

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

感谢唯笑志在分享 原博主原地址:http://www.cnblogs.com/lsjwq/ 目       录 5. 轮询通讯模型开发及注意事项... 2 4.1           概述... 2 4.2           通讯机制说明... 2 4.3           设备驱动开发注意事项... 3 4.3.1    实时发送数据... 3 4.3.2    优先发送其他数据... 3 4.4           宿主程序服务实例配置注意事项... 4 4.5           轮询

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

感谢唯笑志在分享 原博主原地址:http://www.cnblogs.com/lsjwq/ 目       录 7. 自控通讯模式开发及注意事项... 2 7.1           概述... 2 7.2           通讯机制说明... 2 7.3           设备驱动开发注意事项... 3 7.3.1    实时发送数据... 3 7.3.2    发送固定实时请求数据命令... 4 7.3.3    优先发送其他数据... 4 7.3.4    如何选择IO通道发送数据..

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

感谢唯笑志在分享 原博主原地址:http://www.cnblogs.com/lsjwq/ 目       录 6. 并发通讯模式开发及注意事项... 2 6.1           概述... 2 6.2           通讯机制说明... 2 6.3           设备驱动开发注意事项... 3 6.3.1    实时发送数据... 3 6.3.2    优先发送其他数据... 3 6.3.3    如何选择IO通道发送数据... 4 6.3.4    如何以DeviceCode分

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

1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架ServerSuperIO教程>2.服务实例的配置参数说明 <连载 | 物联网框架ServerSuperIO教程>- 3.设备驱动介绍 <连载 | 物联网框架ServerSuperIO教程>-4.如开发一套设备驱动,同时支持串口和网络通讯. <连载 | 物联网框架ServerSupe

iOS平台上的音视频即时通讯应用开发

现在IOS很是火热,一大堆开发人员在捣鼓IOS平台的开发,相信大家也使用过QQ的语音视频对话功能,但是不知道大家有没有试过自己来开发一个基于IOS平台的音视频即时通讯的应用,这个应用必须能够做到跨平台 支持iOS平台设备上的音频即时通讯应用开发 提供Objective-C语言API接口,开放示例源代码 集成H.264.AAC.AMR等编解码技术 封装音视频的采集.编解码.传输.显示和播放等模块 支持Android.Web.PC等设备和iOS之间的互联互通 想要在IOS平台下实现音视频通信,最快捷

浏览器上的音频即时通讯应用开发

网络上视频主播的火热带动了网络视频聊天室开发行业的火热.现在网上企业或者工作室在弄网页的视频聊天室.通过个人学习,借用别人的开发Demo(AnyChat SDK,网上随便搜索一下就可以下载的),加上几十行JavaScript脚本就能轻松实现视频通话:也不用去下载指定的什么浏览器,因为IE.firefox.chrome等windows平台主流浏览器全部通过,完美运行.下边就跟大伙分享分享我的成果,布局代码就不贴出来了,只贴JavaScript脚本. 下面是我所使用的开发包的特点: 1.      

区块链资产交易所搭建IM即时通讯系统开发

区块链资产交易所搭建IM即时通讯系统开发 [本文由源中瑞涂先生编辑/交易所开发VX搜索:ruiec999]随着数字资产交易市场的演进和机构投资者的参与,交易所领域创业面临的合规.安全.专业.透明等问题也逐渐成为其新的竞争力增长点.源中瑞业务涵盖:数字资产交易所开发.场外交易所开发.币币交易所开发.数字资产多币种钱包开发.数字资产抵押系统开发.IM即时通讯系统开发等各类区块链技术系统.(数字资产交易所:jy.ruiec.com)根据18年上半年全球各地交易所数量增长迅速,除传统中心化交易所以外,交

通证经济项目区块链社交im即时通讯系统开发

首先我们要明白"TOKEN"并不是代币的名词,所以我们常说的通证经济项目也不仅仅只是发行代币.这一点我们应该有所了解.通证经济目前是我们常常能够听到的一个名词,但它究竟是何意思呢?即时通讯系统开发微ruiec762679手机138-2311-5027通证经济简单的可以理解为在这个"大家庭"中,每个人的能力都是有限的,可能我擅长这个,你擅长这个,因此我们能够把所有人的力量集中在一个项目中,有钱的出钱,有力的出力,在这个过程中,只要你出过一份力量,系统就会根据你出的力量

关于即时通讯功能开发技术选型

最近研究即时通讯,发现自己使用XMPP,用openfire或者enjebber后台,会很复杂,要涉及到二次开发后台,要用java或者enjebber专用语言,实在无法开展. 后来找了下其他资料,发现现在国内的即时通讯云有好几家,功能都挺不错的,很强大,完爆自己后台,还省事,不花钱,挺好的,毫不犹疑的学习起来了他们的SDK. 我综合各方面最后选择了环信的产品.看了下文档,很快就基本流程,主要接口搞懂了,目测一两天就能搞出一个即使通讯功能,哈哈.