国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C# 通訊網關開發

2019-11-17 03:03:13
字體:
來源:轉載
供稿:網友
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 : IRequestInfo10         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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 项城市| 祁连县| 界首市| 伊宁县| 静乐县| 兴化市| 凯里市| 灵川县| 虞城县| 蒲城县| 永川市| 巩义市| 丹寨县| 济宁市| 大余县| 襄垣县| 青海省| 西和县| 新巴尔虎左旗| 扎囊县| 富宁县| 伊通| 凌源市| 光山县| 丰顺县| 年辖:市辖区| 丽水市| 镇宁| 昆山市| 延庆县| 新泰市| 宾川县| 探索| 彩票| 隆尧县| 沙洋县| 绍兴县| 巩留县| 汽车| 平泉县| 长沙市|