原帖地址:http://www.cnblogs.com/zhuweisky/p/3139801.html
前段时间,有几个研究ESFramework的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送、不需要P2P、不存在好友关系、也不存在组广播、不需要服务器均衡、不需要跨服务器通信、甚至都不需要使用UserID,只要客户端能与服务端进行简单的稳定高效的通信就可以了。于是,他们建议我,整一个轻量级的通信组件来满足类似他们这种项目的需求。我觉得这个建议是有道理的,于是,花了几天时间,我将ESFramework的内核抽离出来,经过修改封装后,形成了StriveEngine,其最大的特点就是稳定高效、易于使用。通过下面这个简单的demo,我们应该就能上手了。文末有demo源码下载,我们先上Demo截图:
1.Demo简介
该Demo总共包括三个项目:
1.StriveEngine.SimpleDemoServer:基于StriveEngine开发的服务端。
2.StriveEngine.SimpleDemoClient:基于StriveEngine开发的客户端。
3.StriveEngine.SimpleDemo:直接基于.NET的Socket开发的客户端,其目的是为了演示:在客户端不使用StriveEngine的情况下,如何与基于StriveEngine的服务端进行通信。
StriveEngine 内置支持TCP/UDP、文本协议/二进制协议,该Demo我们使用TCP、文本格式的消息协议,消息的结束符为"\0"。
2.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.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进行开发,其目演示了:在客户端不使用StriveEngine的情况下(比如客户端是异构系统),如何与基于StriveEngine的服务端进行通信。该客户端只是粗糙地实现了基本目的,很多细节问题都被忽略,像粘包问题、消息重组、掉线检测等等。而这些问题在实际的应用中,是必需要处理的。(StriveEngine中的客户端和服务端引擎都内置解决了这些问题)。
该客户端的代码就不贴了,大家可以在源码中看到。
5.源码下载
Demo源码下载。
本文链接
分享到:
相关推荐
本Demo主要实现了安卓(Android)TCP 客户端(Client)和服务器(Server)Demo的Socket通讯。以及对接硬件的项目数据在十六进制&&byte&&int的转换处理。 要注意BufferedReader的readLine()方法的阻塞问题: 读取socket输入...
平台编译环境:VS2017 ICE版本:3.7.7 ICEbuilder:5.0.9 ...源码中有两套程序: Server:启动服务器,等待连接 。连接后可双方通信 Client:连接服务器,与服务器通讯。 Slice: 手写几个接口即可。
本文将详细解析"TCP客户端服务器发送源码"这一主题,结合提供的文件列表,我们来探讨TCP通信的基本原理以及如何实现客户端和服务器端的交互。 TCP是一种面向连接的协议,意味着在数据传输之前,客户端和服务器之间...
本文将深入探讨C++实现UDP(User Datagram Protocol)服务器与客户端的源码,帮助你理解如何在实际项目中运用这些技术。 UDP是一种无连接的传输层协议,它不保证数据包的顺序、可靠性和重传,但提供了低延迟和高效...
在这个"unity网络游戏开发学习demo源码(服务端+客户端)"中,我们可以深入理解Unity如何与网络编程相结合,创建出互动性强、实时性强的多人在线游戏。 首先,让我们探讨Unity的网络编程基础。Unity内置了Unity ...
在这个"MFC socket 服务器和客户端单文件demo"中,我们将深入探讨如何使用MFC来实现TCP和UDP的Socket通信。 首先,TCP(Transmission Control Protocol)是一种面向连接的协议,它确保数据的可靠传输。在TCP中,...
WebSocket是Web应用中实现双向通信的一种技术,它允许服务器和客户端之间进行实时、低延迟的数据交换。在C#中,可以使用.NET Framework或.NET Core来实现WebSocket客户端和服务端的开发。下面将详细介绍C# WebSocket...
"Demo1 客户端从服务器获取信息(基于networkcomms2.3.1)" 是一个示例项目,它演示了如何利用networkcomms2.3.1这个开源库来实现客户端与服务器之间的通信。在这个场景中,客户端会向服务器发送请求并接收服务器返回...
这个基于TCP协议的客户端demo是一个学习和实践网络编程的好材料,它展示了Unity与外部服务器进行通信的能力,同时也涵盖了基本的TCP通信机制。对于Unity开发者来说,理解并掌握这种通信方式对于开发多人在线游戏或...
基于TCP~socket,Android客户端与PC通信,客户端源码。已经测试,可用。附带apk,和网络调试助手,方便测试。只需提供服务器的IP和端口号,即可通信。 客户端:一次连接,可发送多次数据。 重点是客户端时时接收...
描述中提到的“客户端与服务端通信demo”表明这是一个示例项目,展示了如何在Unity中实现UDP通信。通过这个demo,开发者可以看到如何编写C#脚本来创建一个能够持续向服务器发送信息的客户端。服务端源码的包含意味着...
c# .netcore3.1 SignalR Demo 实现简易聊天室功能,包括用户进入、发送消息、实时接收消息、用户退出、实时查询在线人数, 本项目为SignalIR学习Demo,由本人编写。运行时在浏览器访问http://127.0.0.1:端口号/index...
6. **数据缓存**: 为了提高性能,OPC客户端可能实现数据缓存,存储最近读取的数据,减少不必要的服务器通信。 7. **异常处理**: 在处理OPC通信时,必须考虑到可能出现的异常,如网络故障、服务器无响应等,因此良好...
【标题】"winform c# socket 聊天客户端服务器端源代码"涉及的核心知识点主要集中在Windows Forms(WinForm)应用程序开发、C#编程语言、.NET框架以及网络通信中的Socket编程。这些技术通常用于构建桌面应用中的实时...
基于TCP IP 的socket客户端和服务器的编程,包含两个可执行文件,可以客户端和服务器直接通讯,界面做成了串口工具的样子。
总的来说,libevent创建的客户端和服务端demo展示了如何利用libevent库实现高效的网络通信。通过这个示例,你可以学习到如何在Windows环境下使用libevent进行事件驱动编程,这对于开发高性能的网络应用是非常有价值...
客户端代码则主要负责游戏的图形界面、用户输入处理和与服务器的通信,通常使用Unity3D引擎提供的API来实现。 学习这个源码,我们可以深入了解Unity3D如何构建游戏场景、角色模型、动画效果,以及如何利用脚本语言...
本示例涉及"C#_TCP串口客户端和服务端调试程序demo源码",这意味着它将展示如何使用C#进行TCP/IP通信,同时可能还涉及到模拟串口通信。 TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议...
【标题】"仿微信的Demo服务器端源码"是一个基于XMPP协议的服务器端实现,旨在模拟微信的通信功能。XMPP(Extensible Messaging and Presence Protocol)是一种实时通信协议,常用于即时消息应用,如微信、QQ等。通过...
SocketIO 是一个实时双向通信库,它基于 WebSocket 协议并提供更高级别的接口,使得开发者可以方便地在客户端(如浏览器)和服务器之间进行实时数据交换。在本压缩包中,"socketio-demo与源码.zip" 包含了多个示例,...