前段时间,有几个研究ESFramework网络通讯框架的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送、不需要P2P、不存在好友关系、也不存在组广播、不需要服务器均衡、不需要跨服务器网络通讯、甚至都不需要使用UserID,只要一个客户端能与服务端进行简单的稳定高效的C#网络通信组件就可以了。于是,他们建议我,整一个轻量级的C#网络通信组件来满足类似他们这种项目的需求。我觉得这个建议是有道理的,于是,花了几天时间,我将ESFramework的内核抽离出来,经过修改封装后,形成了StriveEngineC#网络通信组件,其最大的特点就是稳定高效、易于使用。通过下面这个简单的demo,我们应该就能上手了。文末有demo源码下载,我们先上Demo截图:

  

1.StriveEngineC#网络通信组件Demo简介

该Demo总共包括三个项目:

1.StriveEngine.SimpleDemoServer:基于StriveEngine开发的服务端。

2.StriveEngine.SimpleDemoClient:基于StriveEngine开发的客户端。

3.StriveEngine.SimpleDemo:直接基于.NET的Socket开发的客户端,其目的是为了演示:在客户端不使用StriveEngine的情况下,如何与基于StriveEngine的服务端进行网络通讯。

StriveEngine 内置支持TCP/UDP、文本协议/二进制协议,该Demo我们使用TCP、文本格式的消息协议,消息的结束符为"\0"。

2.StriveEngineC#网络通信组件Demo服务端

  1. private ITcpServerEngine tcpServerEngine;
  2. private void button1_Click(object sender, EventArgs e)
  3. {
  4. try
  5. {
  6. //初始化并启动服务端引擎(TCP、文本协议)
  7. this.tcpServerEngine = NetworkEngineFactory.CreateTextTcpServerEngine(int.Parse(this.textBox_port.Text), new DefaultTextContractHelper("\0"));
           this.tcpServerEngine.ClientCountChanged += new CbDelegate<int>(tcpServerEngine_ClientCountChanged);
  8. this.tcpServerEngine.ClientConnected += new CbDelegate<System.Net.IPEndPoint>(tcpServerEngine_ClientConnected);
  9. this.tcpServerEngine.ClientDisconnected += new CbDelegate<System.Net.IPEndPoint>(tcpServerEngine_ClientDisconnected);
  10. this.tcpServerEngine.MessageReceived += new CbDelegate<IPEndPoint, byte[]>(tcpServerEngine_MessageReceived);
  11. this.tcpServerEngine.Initialize();
  12.  
  13. this.button1.Enabled = false;
  14. this.textBox_port.ReadOnly = true;
  15. this.button2.Enabled = true;
  16. }
  17. catch (Exception ee)
  18. {
  19. MessageBox.Show(ee.Message);
  20. }
  21. }
  22.  
  23. void tcpServerEngine_MessageReceived(IPEndPoint client, byte[] bMsg)
  24. {
  25. string msg = System.Text.Encoding.UTF8.GetString(bMsg); //消息使用UTF-8编码
  26. msg = msg.Substring(, msg.Length - ); //将结束标记"\0"剔除
  27. this.ShowClientMsg(client, msg);
  28. }
  29.  
  30. void tcpServerEngine_ClientDisconnected(System.Net.IPEndPoint ipe)
  31. {
  32. string msg = string.Format("{0} 下线", ipe);
  33. this.ShowEvent(msg);
  34. }
  35.  
  36. void tcpServerEngine_ClientConnected(System.Net.IPEndPoint ipe)
  37. {
  38. string msg = string.Format("{0} 上线" ,ipe);
  39. this.ShowEvent(msg);
  40. }
  41.  
  42. void tcpServerEngine_ClientCountChanged(int count)
  43. {
  44. this.ShowConnectionCount(count);
  45. }
  46.  
  47. private void ShowEvent(string msg)
  48. {
  49. if (this.InvokeRequired)
  50. {
  51. this.BeginInvoke(new CbDelegate<string>(this.ShowEvent), msg);
  52. }
  53. else
  54. {
  55. this.toolStripLabel_event.Text = msg;
  56. }
  57. }
  58.  
  59. private void ShowClientMsg(IPEndPoint client, string msg)
  60. {
  61. if (this.InvokeRequired)
  62. {
  63. this.BeginInvoke(new CbDelegate<IPEndPoint,string>(this.ShowClientMsg),client, msg);
  64. }
  65. else
  66. {
  67. ListViewItem item = new ListViewItem(new string[] { DateTime.Now.ToString(), client.ToString(), msg });
  68. this.listView1.Items.Insert(, item);
  69. }
  70. }
  71.  
  72. private void ShowConnectionCount(int clientCount)
  73. {
  74. if (this.InvokeRequired)
  75. {
  76. this.BeginInvoke(new CbDelegate<int>(this.ShowConnectionCount), clientCount);
  77. }
  78. else
  79. {
  80. this.toolStripLabel_clientCount.Text = "在线数量: " + clientCount.ToString();
  81. }
  82. }
  83.  
  84. private void comboBox1_DropDown(object sender, EventArgs e)
  85. {
  86. List<IPEndPoint> list = this.tcpServerEngine.GetClientList();
  87. this.comboBox1.DataSource = list;
  88. }
  89.  
  90. private void button2_Click(object sender, EventArgs e)
  91. {
  92. try
  93. {
  94. IPEndPoint client = (IPEndPoint)this.comboBox1.SelectedItem;
  95. if (client == null)
  96. {
  97. MessageBox.Show("没有选中任何在线客户端!");
  98. return;
  99. }
  100.  
  101. if (!this.tcpServerEngine.IsClientOnline(client))
  102. {
  103. MessageBox.Show("目标客户端不在线!");
  104. return;
  105. }
  106.  
  107. string msg = this.textBox_msg.Text + "\0";// "\0" 表示一个消息的结尾
  108. byte[] bMsg = System.Text.Encoding.UTF8.GetBytes(msg);//消息使用UTF-8编码
  109. this.tcpServerEngine.SendMessageToClient(client, bMsg);
  110. }
  111. catch (Exception ee)
  112. {
  113. MessageBox.Show(ee.Message);
  114. }
  115. }

关于服务端引擎的使用,主要就以下几点:

(1)首先调用NetworkEngineFactory的CreateTextTcpServerEngine方法创建引擎(服务端、TCP、Text协议)。

(2)根据需要,预定引擎实例的某些事件(如MessageReceived事件)。

(3)调用引擎实例的Initialize方法启动网络通讯引擎。

(4)调用服务端引擎的SendMessageToClient方法,发送消息给客户端。

3.StriveEngine C#网络通信组件Demo客户端

  1. private ITcpPassiveEngine tcpPassiveEngine;
  2. private void button3_Click(object sender, EventArgs e)
  3. {
  4. try
  5. {
  6. //初始化并启动客户端引擎(TCP、文本协议)
  7. this.tcpPassiveEngine = NetworkEngineFactory.CreateTextTcpPassiveEngine(this.textBox_IP.Text, int.Parse(this.textBox_port.Text), new DefaultTextContractHelper("\0"));
  8. this.tcpPassiveEngine.MessageReceived += new CbDelegate<System.Net.IPEndPoint, byte[]>(tcpPassiveEngine_MessageReceived);
  9. this.tcpPassiveEngine.AutoReconnect = true;//启动掉线自动重连
  10. this.tcpPassiveEngine.ConnectionInterrupted += new CbDelegate(tcpPassiveEngine_ConnectionInterrupted);
  11. this.tcpPassiveEngine.ConnectionRebuildSucceed += new CbDelegate(tcpPassiveEngine_ConnectionRebuildSucceed);
  12. this.tcpPassiveEngine.Initialize();
  13.  
  14. this.button2.Enabled = true;
  15. this.button3.Enabled = false;
  16. MessageBox.Show("连接成功!");
  17. }
  18. catch (Exception ee)
  19. {
  20. MessageBox.Show(ee.Message);
  21. }
  22. }
  23.  
  24. void tcpPassiveEngine_ConnectionRebuildSucceed()
  25. {
  26. if (this.InvokeRequired)
  27. {
  28. this.BeginInvoke(new CbDelegate(this.tcpPassiveEngine_ConnectionInterrupted));
  29. }
  30. else
  31. {
  32. this.button2.Enabled = true;
  33. MessageBox.Show("重连成功。");
  34. }
  35. }
  36.  
  37. void tcpPassiveEngine_ConnectionInterrupted()
  38. {
  39. if (this.InvokeRequired)
  40. {
  41. this.BeginInvoke(new CbDelegate(this.tcpPassiveEngine_ConnectionInterrupted));
  42. }
  43. else
  44. {
  45. this.button2.Enabled = false;
  46. MessageBox.Show("您已经掉线。");
  47. }
  48. }
  49.  
  50. void tcpPassiveEngine_MessageReceived(System.Net.IPEndPoint serverIPE, byte[] bMsg)
  51. {
  52. string msg = System.Text.Encoding.UTF8.GetString(bMsg); //消息使用UTF-8编码
  53. msg = msg.Substring(, msg.Length - ); //将结束标记"\0"剔除
  54. this.ShowMessage(msg);
  55. }
  56.  
  57. private void ShowMessage(string msg)
  58. {
  59. if (this.InvokeRequired)
  60. {
  61. this.BeginInvoke(new CbDelegate<string>(this.ShowMessage), msg);
  62. }
  63. else
  64. {
  65. ListViewItem item = new ListViewItem(new string[] { DateTime.Now.ToString(), msg });
  66. this.listView1.Items.Insert(, item);
  67. }
  68. }
  69.  
  70. private void button2_Click(object sender, EventArgs e)
  71. {
  72. string msg = this.textBox_msg.Text + "\0";// "\0" 表示一个消息的结尾
  73. byte[] bMsg = System.Text.Encoding.UTF8.GetBytes(msg);//消息使用UTF-8编码
  74. this.tcpPassiveEngine.SendMessageToServer(bMsg);
  75. }

关于客户端引擎的使用,与服务端类似:

(1)首先调用NetworkEngineFactory的CreateTextTcpPassiveEngine方法创建引擎(客户端、TCP、Text协议)。

(2)根据需要,预定引擎实例的某些事件(如MessageReceived、ConnectionInterrupted 事件)。

(3)根据需要,设置引擎实例的某些属性(如AutoReconnect属性)。

(4)调用引擎实例的Initialize方法启动网络通讯引擎。

(5)调用客户端引擎的SendMessageToServer方法,发送消息给服务端。

4.基于Socket的客户端

这个客户端直接基于.NET的Socket进行开发,其目演示了:在客户端不使用StriveEngineC#网络通信组件的情况下(比如客户端是异构系统),如何与基于StriveEngine的服务端进行网络通信。该客户端只是粗糙地实现了基本目的,很多细节问题都被忽略,像粘包问题、消息重组、掉线检测等等。而这些问题在实际的应用中,是必需要处理的。(StriveEngineC#网络通信组件中的客户端和服务端引擎都内置解决了这些问题)。
该客户端的代码就不贴了,大家可以在源码中看到。

5.StriveEngine C#网络通信组件Demo源码下载

  文本协议网络通讯demo源码

 附相关系列: C#网络通信组件二进制网络通讯demo源码及说明文档

                        C#网络通信组件打通B/S与C/S网络通讯demo源码与说明文档

另附:简单即时通讯Demo源码及说明

版权声明:本文为博主原创文章,未经博主允许不得转载。

轻量级通信引擎StriveEngine —— C/S通信demo(附源码)的更多相关文章

  1. 轻量级通信引擎StriveEngine —— C/S通信demo(2) —— 使用二进制协议 (附源码)

    在网络上,交互的双方基于TCP或UDP进行通信,通信协议的格式通常分为两类:文本消息.二进制消息. 文本协议相对简单,通常使用一个特殊的标记符作为一个消息的结束. 二进制协议,通常是由消息头(Head ...

  2. 一个简单的IM系统(Demo附源码)-- ESFramework 4.0 快速上手(08)

    前面的文章已经介绍完了基于ESFramework/ESPlus进行二次开发的所有要点,现在,我们可以开始小试牛刀了. 本文将介绍使用ESFramework的Rapid引擎开发的两个最简单的Demo,E ...

  3. C#轻量级通通讯组件StriveEngine —— C/S通信开源demo(2) —— 使用二进制协议 (附源码)

    前段时间,有几个研究ESFramework通信框架的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送.不需要P2P.不存在好友关 ...

  4. 微服务8:通信之RPC实践篇(附源码)

    ★微服务系列 微服务1:微服务及其演进史 微服务2:微服务全景架构 微服务3:微服务拆分策略 微服务4:服务注册与发现 微服务5:服务注册与发现(实践篇) 微服务6:通信之网关 微服务7:通信之RPC ...

  5. 聊天系统Demo,增加Silverlight客户端(附源码)-- ESFramework 4.0 快速上手(09)

    在ESFramework 4.0 快速上手 -- 入门Demo,一个简单的IM系统(附源码)一文中,我们介绍了使用ESFramework的Rapid引擎开发的winform聊天程序,本文我们将在之前d ...

  6. Managed DirectX中的DirectShow应用(简单Demo及源码)

    阅读目录 介绍 准备工作 环境搭建 简单Demo 显示效果 其他 Demo下载 介绍 DirectX是Microsoft开发的基于Windows平台的一组API,它是为高速的实时动画渲染.交互式音乐和 ...

  7. 聊天系统Demo,增加文件传送功能(附源码)-- ESFramework 4.0 快速上手(14)

    本文我们将介绍在ESFramework 4.0 快速上手(08) -- 入门Demo,一个简单的IM系统(附源码)的基础上,增加文件传送的功能.如果不了解如何使用ESFramework提供的文件传送功 ...

  8. 轻量级C#网络通信组件StriveEngine —— C/S通信开源demo(附源码)

    前段时间,有几个研究ESFramework网络通讯框架的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送.不需要P2P.不存在好 ...

  9. 通信服务器群集——跨服务器通信Demo(源码)

    对于一些基于TCP Socket的大型C/S应用来说,能进行跨服务器通信可能是一个绕不开的功能性需求.出现这种需求的场景类似于下面描述的这种情况. 假设,我们一台TCP应用服务器能同时承载10000人 ...

随机推荐

  1. 01.SQLServer性能优化之---水平分库扩展

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 第一次引入文件组的概念:http://www.cnblogs.com/dunitian/ ...

  2. C# 中参数验证方式的演变

    一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空,如果是字符可能有长度限 ...

  3. CoreCRM 开发实录——开始之新项目的技术选择

    2016年11月,接受了一个工作,是对"悟空CRM"进行一些修补.这是一个不错的 CRM,开源,并提供一个 SaaS 的服务.正好微软的 .NET Core 和 ASP.NET C ...

  4. WebApi - 路由

    这段时间的博客打算和大家一起分享下webapi的使用和心得,主要原因是群里面有朋友说希望能有这方面的文章分享,随便自己也再回顾下:后面将会和大家分不同篇章来分享交流心得,希望各位多多扫码支持和点赞,谢 ...

  5. Xamarin+Prism开发详解五:页面布局基础知识

    说实在的研究Xamarin到现在,自己就没设计出一款好的UI,基本都在研究后台逻辑之类的!作为Xamarin爱好者,一些简单的页面布局知识还是必备的. 布局常见标签: StackLayout Abso ...

  6. [开发笔记] Graph Databases on developing

    TimeWall is a graph databases github It be used to apply mathematic model and social network with gr ...

  7. MediatorPattern(中介者模式)

    /** * 中介者模式 * @author TMAC-J * 研究了这么多设计模式,觉得无非就是几点: * 1.若两个类有耦合关系,设立一个中间类,处理两个类的关系,把两个类的耦合降低 * 2.面向接 ...

  8. AEAI DP V3.6.0 升级说明,开源综合应用开发平台

    AEAI DP综合应用开发平台是一款扩展开发工具,专门用于开发MIS类的Java Web应用,本次发版的AEAI DP_v3.6.0版本为AEAI DP _v3.5.0版本的升级版本,该产品现已开源并 ...

  9. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  10. 找到第k个最小元----快速选择

    此算法借用快速排序算法. 这个快速选择算法主要利用递归调用,数组存储方式.包含3个文件,头文件QuickSelect.h,库函数QuickSelect.c,测试文件TestQuickSelect. 其 ...