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

前段时间,有几个研究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服务端

    private ITcpServerEngine tcpServerEngine;
    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            //初始化并启动服务端引擎(TCP、文本协议)
            this.tcpServerEngine = NetworkEngineFactory.CreateTextTcpServerEngine(int.Parse(this.textBox_port.Text), new DefaultTextContractHelper("\0"));         this.tcpServerEngine.ClientCountChanged += new CbDelegate<int>(tcpServerEngine_ClientCountChanged);
            this.tcpServerEngine.ClientConnected += new CbDelegate<System.Net.IPEndPoint>(tcpServerEngine_ClientConnected);
            this.tcpServerEngine.ClientDisconnected += new CbDelegate<System.Net.IPEndPoint>(tcpServerEngine_ClientDisconnected);
            this.tcpServerEngine.MessageReceived += new CbDelegate<IPEndPoint, byte[]>(tcpServerEngine_MessageReceived);
            this.tcpServerEngine.Initialize();

            this.button1.Enabled = false;
            this.textBox_port.ReadOnly = true;
            this.button2.Enabled = true;
        }
        catch (Exception ee)
        {
            MessageBox.Show(ee.Message);
        }
    }

    void tcpServerEngine_MessageReceived(IPEndPoint client, byte[] bMsg)
    {
        string msg = System.Text.Encoding.UTF8.GetString(bMsg); //消息使用UTF-8编码
        msg = msg.Substring(0, msg.Length - 1); //将结束标记"\0"剔除
        this.ShowClientMsg(client, msg);
    }

    void tcpServerEngine_ClientDisconnected(System.Net.IPEndPoint ipe)
    {
        string msg = string.Format("{0} 下线", ipe);
        this.ShowEvent(msg);
    }

    void tcpServerEngine_ClientConnected(System.Net.IPEndPoint ipe)
    {
        string msg = string.Format("{0} 上线" ,ipe);
        this.ShowEvent(msg);
    }        

    void tcpServerEngine_ClientCountChanged(int count)
    {
        this.ShowConnectionCount(count);
    }

    private void ShowEvent(string msg)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new CbDelegate<string>(this.ShowEvent), msg);
        }
        else
        {
            this.toolStripLabel_event.Text = msg;
        }
    }

    private void ShowClientMsg(IPEndPoint client, string msg)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new CbDelegate<IPEndPoint,string>(this.ShowClientMsg),client, msg);
        }
        else
        {
            ListViewItem item = new ListViewItem(new string[] { DateTime.Now.ToString(), client.ToString(), msg });
            this.listView1.Items.Insert(0, item);
        }
    }

    private void ShowConnectionCount(int clientCount)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new CbDelegate<int>(this.ShowConnectionCount), clientCount);
        }
        else
        {
            this.toolStripLabel_clientCount.Text = "在线数量: " + clientCount.ToString();
        }
    }

    private void comboBox1_DropDown(object sender, EventArgs e)
    {
        List<IPEndPoint> list = this.tcpServerEngine.GetClientList();
        this.comboBox1.DataSource = list;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        try
        {
            IPEndPoint client = (IPEndPoint)this.comboBox1.SelectedItem;
            if (client == null)
            {
                MessageBox.Show("没有选中任何在线客户端!");
                return;
            }

            if (!this.tcpServerEngine.IsClientOnline(client))
            {
                MessageBox.Show("目标客户端不在线!");
                return;
            }

            string msg = this.textBox_msg.Text + "\0";// "\0" 表示一个消息的结尾
            byte[] bMsg = System.Text.Encoding.UTF8.GetBytes(msg);//消息使用UTF-8编码
            this.tcpServerEngine.SendMessageToClient(client, bMsg);
        }
        catch (Exception ee)
        {
            MessageBox.Show(ee.Message);
        }
    }

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

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

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

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

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

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

    private ITcpPassiveEngine tcpPassiveEngine;
    private void button3_Click(object sender, EventArgs e)
    {
        try
        {
            //初始化并启动客户端引擎(TCP、文本协议)
            this.tcpPassiveEngine = NetworkEngineFactory.CreateTextTcpPassiveEngine(this.textBox_IP.Text, int.Parse(this.textBox_port.Text), new DefaultTextContractHelper("\0"));
            this.tcpPassiveEngine.MessageReceived += new CbDelegate<System.Net.IPEndPoint, byte[]>(tcpPassiveEngine_MessageReceived);
            this.tcpPassiveEngine.AutoReconnect = true;//启动掉线自动重连
            this.tcpPassiveEngine.ConnectionInterrupted += new CbDelegate(tcpPassiveEngine_ConnectionInterrupted);
            this.tcpPassiveEngine.ConnectionRebuildSucceed += new CbDelegate(tcpPassiveEngine_ConnectionRebuildSucceed);
            this.tcpPassiveEngine.Initialize();

            this.button2.Enabled = true;
            this.button3.Enabled = false;
            MessageBox.Show("连接成功!");
        }
        catch (Exception ee)
        {
            MessageBox.Show(ee.Message);
        }
    }

    void tcpPassiveEngine_ConnectionRebuildSucceed()
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new CbDelegate(this.tcpPassiveEngine_ConnectionInterrupted));
        }
        else
        {
            this.button2.Enabled = true;
            MessageBox.Show("重连成功。");
        }
    }

    void tcpPassiveEngine_ConnectionInterrupted()
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new CbDelegate(this.tcpPassiveEngine_ConnectionInterrupted));
        }
        else
        {
            this.button2.Enabled = false;
            MessageBox.Show("您已经掉线。");
        }
    }

    void tcpPassiveEngine_MessageReceived(System.Net.IPEndPoint serverIPE, byte[] bMsg)
    {
        string msg = System.Text.Encoding.UTF8.GetString(bMsg); //消息使用UTF-8编码
        msg = msg.Substring(0, msg.Length - 1); //将结束标记"\0"剔除
        this.ShowMessage(msg);
    }       

    private void ShowMessage(string msg)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new CbDelegate<string>(this.ShowMessage), msg);
        }
        else
        {
            ListViewItem item = new ListViewItem(new string[] { DateTime.Now.ToString(), msg });
            this.listView1.Items.Insert(0, item);
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        string msg = this.textBox_msg.Text + "\0";// "\0" 表示一个消息的结尾
        byte[] bMsg = System.Text.Encoding.UTF8.GetBytes(msg);//消息使用UTF-8编码
        this.tcpPassiveEngine.SendMessageToServer(bMsg);
    }

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

(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源码及说明

 

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

时间: 2024-08-16 11:13:14

轻量级C#网络通信组件StriveEngine —— C/S通信开源demo(附源码)的相关文章

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

前段时间,有几个研究ESFramework通信框架的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点"杀鸡用牛刀"的意思,因为他们的项目不需要文件传送.不需要P2P.不存在好友关系.也不存在组广播.不需要服务器均衡.不需要跨服务器通信.甚至都不需要使用UserID,只要客户端能与服务端进行简单的稳定高效的通信就可以了.于是,他们建议我,整一个轻量级的C#通讯组件来满足类似他们这种项目的需求.我觉得这个建议是有道理的,于是,花了几天时间,我将ESFramework的

android-使用环信SDK开发即时通信功能(附源码下载)_Android

最近项目中集成即时聊天功能,挑来拣去,最终选择环信SDK来进行开发,选择环信的主要原因是接口方便.简洁,说明文档清晰易懂.文档有Android.iOS.和后台服务器端,还是非常全的.  环信官网:http://www.easemob.com/ 本篇文章目的主要在于说明环信Demo如何实现即时通信的.我在集成环信SDK到我们自己开发的app之前,研究了一下环信demo的代码,看了两三天的样子,基本搞清楚来龙去脉,但是只是清楚来龙去脉,要说到里面的细节可能得深一步研究,但是这就够了,已经可以把dem

android-使用环信SDK开发即时通信功能(附源码下载)

最近项目中集成即时聊天功能,挑来拣去,最终选择环信SDK来进行开发,选择环信的主要原因是接口方便.简洁,说明文档清晰易懂.文档有Android.iOS.和后台服务器端,还是非常全的. 环信官网:http://www.easemob.com/ 本篇文章目的主要在于说明环信Demo如何实现即时通信的.我在集成环信SDK到我们自己开发的app之前,研究了一下环信demo的代码,看了两三天的样子,基本搞清楚来龙去脉,但是只是清楚来龙去脉,要说到里面的细节可能得深一步研究,但是这就够了,已经可以把demo

.Net 转战 Android 4.4 日常笔记(9)--常用组件的使用方法[附源码]

原文:.Net 转战 Android 4.4 日常笔记(9)--常用组件的使用方法[附源码] 经过两天的学习,把常用的组件都学习了一遍,并做成了App 学习可能真没有捷径,跟学习html有点类似,都是一个控件一个控件学习并使用,最后拼凑成一个系统 链接:http://pan.baidu.com/s/1hqefzEW 密码:zbel  最低API 2.3 目标API 4.4 采用Android Studio 0.58IDE 希望给和我同样的初学者带来一些便利,和开发时候可以查询,第一个版本可能比较

进程通信-求前后台程序源码示例

问题描述 求前后台程序源码示例 打个比方,迅雷软件有一个thunder负责界面,还有一个thunderPlatform负责P2P等.想找一个类似的前后台通信的程序,linux或者windows平台上的都皆可,进程间的通信方法不限,最好是socket或者pipes,如果能有概设和详设就更好了,最近要做一个类似的项目想参考下前后台进程通信,万分感谢! 解决方案 http://blog.csdn.net/xnwyd/article/details/7359506http://blog.chinauni

【BootStrap】图片样式、辅助类样式和CSS组件 -附源码

转载请注明出处http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 首先把模板代码上上来: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="

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

对于一些基于TCP Socket的大型C/S应用来说,能进行跨服务器通信可能是一个绕不开的功能性需求.出现这种需求的场景类似于下面描述的这种情况. 假设,我们一台TCP应用服务器能同时承载10000人同时在线,而同时在线用户数量通常为5万多,那可想而知,我们需要部署6台TCP应用服务器来分担这些负载.再假设,我们的应用中,任意的两个客户端都有可能需要互发消息(比如,传送文件),这时问题就来了 -- 因为要互发消息的这两个客户端连接的可能是不同的服务器. 如何解决了?这就需要引入群集平台的概念.群

ASP.Net C#2.0全能数据库组件 (含下载实例源码地址)

asp.net|数据|数据库|下载 /* ?--------------------------?   | Title: ASP.Net C#2.0全能数据库组件 (开源含实例源码)|   | Project: DBOperatorService.Data                    |   | Subarea: DataSet                                   |   | Author: ξ箫音ξ                           

通用社区登陆组件技术分享(开源)下篇:OAuth 源码下载及原理解说

上节内容: 1:通用社区登陆组件技术分享(开源)上篇:OAuth 授权登陆介绍 2:通用社区登陆组件技术分享(开源)中篇:OAuth 登陆组件流程及组件集成方法   本节内容: 1:简述组件设计的过程及思路及部分重点源码讲解 2:源码下载 3:扩展机制说明  附源码截图:等会看以下思路时,可以对照着看:   一:简述组件设计的过程及思路   1:为什么想到弄成组件? 当重复的代码或相似的事件>=2个时,我都会想一下,是否还可能有第3个,第4个相近的,如果有,就会统一处理,组件就是设计的再通用一些