AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

本文涉及的产品
性能测试 PTS,5000VUM额度
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
云原生网关 MSE Higress,422元/月
简介:

一、AgileEAS.NET SOA中间件Socket/Tcp框架介绍

     在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA中间Socket/Tcp框架进行了总体的介绍,我们知道

AgileEAS.NET SOA中间件Socket/Tcp框架是一套Socket通信的消息中间件:

image_thumb2_thumb3

二、简单例子-实现简单的服务器客户段消息应答

     我们接下来实现一个简单的例子,例子的场景非常的简单,客户端向服务端发送一个请求消息,服务段收到消息之后显示消息内容,并对客户端发送一个应答消息,客户端收到应答消息之后显示这个应答消息,对于本例子,我们使用WinForm应用来实现。

三、一步一步实现

     首先我们下载AgileEAS.NET SOA 中间件最新版本5.0/5.1,下载地址:http://www.smarteas.net/page/EAS_NET_Downloads.aspx

     首先我们打开VS2010或者VS2010创建一个类为项目Socket.Demo.Messages:

YHD7XBAITB_35QOK7_thumb3

     删除默认的Class1.cs,引用AgileEAS.NET SOA 中间件的EAS.MicroKernel.dll程序集文件,然后添加一个类请求消息类RequestMessage:

   1: [Serializable]
   2: [Message("14DB99D2-190C-48E9-879A-EA833247F24A", "请求消息")]
   3: public class RequestMessage:IMessage
   4: {
   5:     /// <summary>
   6:     /// 消息内容。
   7:     /// </summary>
   8:     public string Content
   9:     {
  10:         get;
  11:         set;
  12:     }
  13:  
  14:     public void Load(EAS.IO.BufferReader reader)
  15:     {
  16:         this.Content = reader.ReadString();   
  17:     }
  18:  
  19:     public void WriteTo(EAS.IO.BufferWriter writer)
  20:     {
  21:         writer.Write(this.Content);
  22:     }
  23: }

     以上代码我们定义了一个请求消息,消息ID为"14DB99D2-190C-48E9-879A-EA833247F24A",Load方法实现从消息读取器之中读出消息内容,WriteTo方法实现把消息内容写入消息编写器,转换为字节流供通信引擎进行收发,接下来我们再增加一个应答消息类ResponseMessage:

   1: [Serializable]
   2: [Message("D94C51C4-8423-4BF6-A011-184265BBA62C", "应答消息")]
   3: public class ResponseMessage : RequestMessage, IMessage
   4: {
   5: }

    在本例子之中应答消息与请求消息其内容没有本质的区别,都是文本通信,所以就直接继承了RequestMessage,变更了MessageID和消息说明。

到此为止,我们已经完成了请求消息与应答消息的定义Socket.Demo.Messages项目结构下:

KATXWNNI0IHYE_FII_thumb1

   接下来我们来实现服务端程序,向解决方案添加一个Socket.Demo.Server的Windows窗体应用程序:

QQ20131011173059_thumb2

   同样,我们要引用AgileEAS.NET SOA 中间件的EAS.MicroKernel.dll程序集文件,并且还要引用Socket.Demo.Messages项目,然后重命名Form1为MainForm,并做以下界面布局:

QQ20131011173717_thumb2

   接下来我们向服务端加载请求消息的处理器RequestMessageHandler,用于服务端收到请求消息之后的处理动作:

   1: class RequestMessageHandler:AbstractMessageHandler<RequestMessage>
   2: {
   3:     public override void Process(NetSession context, uint instanceId, RequestMessage message)
   4:     {
   5:         //1.显示消息。
   6:         MainForm.Instance.ShowMessage(message);
   7:  
   8:         //2.向客户端回复一条应当消息。
   9:         string content = string.Format("{0}已收到,OK!", message.Content);
  10:         ResponseMessage responseMessage = new ResponseMessage { Content = content };
  11:         context.Reply(responseMessage);
  12:     }
  13: }

     然后我们实现MainForm窗体的功能代码:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.ComponentModel;
   4: using System.Data;
   5: using System.Drawing;
   6: using System.Linq;
   7: using System.Text;
   8: using System.Windows.Forms;
   9: using EAS.Sockets;
  10: using Socket.Demo.Messages;
  11:  
  12: namespace Socket.Demo.Server
  13: {
  14:     public partial class MainForm : Form
  15:     {
  16:         public static MainForm Instance = null;
  17:         private SocketServer m_SocketServer = null;
  18:  
  19:         public MainForm()
  20:         {
  21:             InitializeComponent();
  22:             Instance = this;
  23:  
  24:             //实例化对象。
  25:             this.m_SocketServer = new SocketServer();
  26:  
  27:             //端口号为6610
  28:             this.m_SocketServer.Port = 6610;
  29:  
  30:             //注册消息处理器。
  31:             this.m_SocketServer.AddHander<RequestMessage>(new RequestMessageHandler());
  32:  
  33:             this.m_SocketServer.ServerStarted += new EventHandler(m_SocketServer_ServerStarted);
  34:             this.m_SocketServer.ServerStopped+=new EventHandler(m_SocketServer_ServerStopped);
  35:         }
  36:  
  37:         void m_SocketServer_ServerStarted(object sender, EventArgs e)
  38:         {
  39:             this.btnStart.Enabled = false;
  40:             this.btnStop.Enabled = true;
  41:         }
  42:  
  43:         void m_SocketServer_ServerStopped(object sender, EventArgs e)
  44:         {
  45:             this.btnStart.Enabled = true;
  46:             this.btnStop.Enabled = false;
  47:         }
  48:  
  49:         internal void ShowMessage(Messages.RequestMessage message)
  50:         {
  51:             Action UI = () =>
  52:                 {
  53:                     this.tbMessage.AppendText(message.Content);
  54:                     this.tbMessage.AppendText("\r\n");
  55:                     this.tbMessage.ScrollToCaret();
  56:                 };
  57:  
  58:             this.Invoke(UI);
  59:         }
  60:  
  61:         private void btnStart_Click(object sender, EventArgs e)
  62:         {
  63:             if (this.m_SocketServer.ServerState == ServerState.Stoped)
  64:             {
  65:                 this.m_SocketServer.StartServer();
  66:             }
  67:         }
  68:  
  69:         private void btnStop_Click(object sender, EventArgs e)
  70:         {
  71:             if (this.m_SocketServer.ServerState != ServerState.Stoped)
  72:             {
  73:                 this.m_SocketServer.StopServer();
  74:             }
  75:         }
  76:     }
  77: }

     其中代码this.m_SocketServer.AddHander<RequestMessage>(new RequestMessageHandler());完成向服务器注册请求消息的处理器对象,internal void ShowMessage(Messages.RequestMessage message)方法用于显示服务器收到的请求消息。

    接下来我们来实现客户端程序,向解决方案添加一个Socket.Demo.Client的Windows窗体应用程序,同前面一样样,我们要引用AgileEAS.NET SOA 中间件的EAS.MicroKernel.dll程序集文件,并且还要引用Socket.Demo.Messages项目,然后重命名Form1为MainForm,并做以下界面布局:

29_thumb3

    接下来我们向客户端加载应答消息的处理器ResponseMessageHandler,用于客户端收到应答消息之后的处理动作:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using EAS.Sockets.Messages;
   6: using Socket.Demo.Messages;
   7: using EAS.Sockets;
   8:  
   9: namespace Socket.Demo.Client
  10: {
  11:     class ResponseMessageHandler : AbstractMessageHandler<ResponseMessage>
  12:     {
  13:         public override void Process(NetSession context, uint instanceId, ResponseMessage message)
  14:         {
  15:             //1.显示消息。
  16:             MainForm.Instance.ShowMessage(message);
  17:         }
  18:     }
  19: }

         然后我们实现MainForm窗体的功能代码:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.ComponentModel;
   4: using System.Data;
   5: using System.Drawing;
   6: using System.Linq;
   7: using System.Text;
   8: using System.Windows.Forms;
   9: using EAS.Sockets;
  10: using Socket.Demo.Messages;
  11:  
  12: namespace Socket.Demo.Client
  13: {
  14:     public partial class MainForm : Form
  15:     {
  16:         public static MainForm Instance = null;
  17:         SocketClient m_SocketClient;
  18:  
  19:         public MainForm()
  20:         {
  21:             InitializeComponent();
  22:             Instance = this;
  23:             this.m_SocketClient = new SocketClient();
  24:             this.m_SocketClient.IPAddress = "127.0.0.1";
  25:             this.m_SocketClient.Port = 6610;
  26:             this.m_SocketClient.AddHander<ResponseMessage>(new ResponseMessageHandler());
  27:  
  28:             this.m_SocketClient.Connected += new EventHandler(m_SocketClient_Connected);
  29:             this.m_SocketClient.Closed += new EventHandler(m_SocketClient_Closed);
  30:         }
  31:  
  32:         void m_SocketClient_Connected(object sender, EventArgs e)
  33:         {
  34:             this.btnConnect.Enabled = false;
  35:             this.btnClose.Enabled = true;
  36:             this.btnSend.Enabled = false;
  37:         }
  38:  
  39:         void m_SocketClient_Closed(object sender, EventArgs e)
  40:         {
  41:             this.btnConnect.Enabled = true;
  42:             this.btnClose.Enabled = false;
  43:             this.btnSend.Enabled = true;
  44:         }
  45:  
  46:         internal void ShowMessage(ResponseMessage message)
  47:         {
  48:             Action UI = () =>
  49:             {
  50:                 this.tbMessage.AppendText(message.Content);
  51:                 this.tbMessage.AppendText("\r\n");
  52:                 this.tbMessage.ScrollToCaret();
  53:             };
  54:  
  55:             this.Invoke(UI);
  56:         }
  57:  
  58:         private void btnConnect_Click(object sender, EventArgs e)
  59:         {
  60:             if (this.m_SocketClient.ClientState == ClientState.Closed)
  61:             {
  62:                 this.m_SocketClient.Connect();
  63:             }
  64:         }
  65:  
  66:         private void btnClose_Click(object sender, EventArgs e)
  67:         {
  68:             if (this.m_SocketClient.ClientState != ClientState.Closed)
  69:             {
  70:                 this.m_SocketClient.Connect();
  71:             }
  72:         }
  73:  
  74:         private void btnSend_Click(object sender, EventArgs e)
  75:         {
  76:             if (this.tbSend.Text.Trim().Length == 0)
  77:             {
  78:                 MessageBox.Show("不能发空消息");
  79:                 return;
  80:             }
  81:  
  82:             if (this.m_SocketClient.ClientState != ClientState.Closed)
  83:             {
  84:                 RequestMessage rm = new RequestMessage();
  85:                 rm.Content = this.tbSend.Text.Trim();
  86:                 this.m_SocketClient.Send(rm);
  87:             }
  88:         }
  89:     }
  90: }

        OK,这个简单的例子我们已经开发完成了,接下来,我们来编译、测试一下这个例子!

四、运行测试

     首先我们启动服务端程序、启动服务器,然后启动客户段并连接服务器,从客户段向服务器发送消息,服务端会显示客户端发送的消息会向客户端发送一个应答消息。

12_thumb2

五、本例源代码下载

     本文例子源代码请通过http://42.121.30.77/downloads/eas/examples/Socket.Demo.rar进行下载,有关于AgileEAS.NET SOA 中间件平台请通过AgilleEAS.NET SOA 中站件平台官方网站最新下载页面下载。

六、联系我们

     为了完善、改进和推广AgileEAS.NET而成立了敏捷软件工程实验室,是一家研究、推广和发展新技术,并致力于提供具有自主知识产权的业务基础平台软件,以及基于业务基础平台了开发的管理软件的专业软件提供商。主要业务是为客户提供软件企业研发管理解决方案、企业管理软件开发,以及相关的技术支持,管理及技术咨询与培训业务。

     AgileEAS.NET平台自2004年秋呱呱落地一来,我就一直在逐步完善和改进,也被应用于保险、医疗、电子商务、房地产、铁路、教育等多个应用,但一直都是以我个人在推广,2010年因为我辞职休息,我就想到把AgileEAS.NET推向市场,让更多的人使用。

     我的技术团队成员都是合作多年的老朋友,因为这个平台是免费的,所以也没有什么收入,都是由程序员的那种理想与信念坚持,在此我感谢一起奋斗的朋友。

团队网站:http://www.agilelab.cn

AgileEAS.NET网站:http://www.smarteas.net

官方博客:http://eastjade.cnblogs.com

QQ:47920381,AgileEAS.NET

QQ群:113723486(AgileEAS SOA 平台)/上限1000人

199463175(AgileEAS SOA 交流)/上限1000人

120661978(AgileEAS.NET 平台交流)/上限1000人

212867943(AgileEAS.NET研究)/上限500人

147168308(AgileEAS.NET应用)/上限500人

172060626(深度AgileEAS.NET平台)/上限500人

116773358(AgileEAS.NET 平台)/上限500人

125643764(AgileEAS.NET探讨)/上限500人

193486983(AgileEAS.NET 平台)/上限500人

邮件:james@agilelab.cn,mail.james@qq.com,

电话:18629261335。


作者:魏琼东 
出处:http://www.cnblogs.com/eastjade
关于作者:有13年的软件从业经历,专注于中小软件企业软件开发过程研究,通过在技术与管理帮助中小软件企业实现技术层面开源节流的目的。熟悉需求分析、企业架构、项目管理。现主要从事基于AgileEAS.NET平台的技术咨询工作,主要服务于医疗卫生、铁路、电信、物流、物联网、制造、零售等行业。如有问题或建议,请多多赐教! 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过mail.james@qq.com 联系我,也可以加入QQ群:113723486、199463175、116773358、116773358、212867943、147168308、59827496、193486983、15118502和大家共同讨论,非常感谢。



    本文转自魏琼东博客园博客,原文链接:http://www.cnblogs.com/eastjade/p/3371631.html,如需转载请自行联系原作者

相关文章
|
12天前
|
设计模式 开发框架 JavaScript
基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用!
基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用!
|
1月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
113 3
|
12天前
|
消息中间件 监控 数据可视化
基于.NET开源、功能强大且灵活的工作流引擎框架
基于.NET开源、功能强大且灵活的工作流引擎框架
|
12天前
|
开发框架 网络协议 .NET
C#/.NET/.NET Core优秀项目和框架2024年10月简报
C#/.NET/.NET Core优秀项目和框架2024年10月简报
|
12天前
|
网络协议 Unix Linux
精选2款C#/.NET开源且功能强大的网络通信框架
精选2款C#/.NET开源且功能强大的网络通信框架
|
12天前
|
开发框架 JavaScript 前端开发
2024年全面且功能强大的.NET快速开发框架推荐,效率提升利器!
2024年全面且功能强大的.NET快速开发框架推荐,效率提升利器!
|
12天前
|
网络协议 网络安全 Apache
一个整合性、功能丰富的.NET网络通信框架
一个整合性、功能丰富的.NET网络通信框架
|
1月前
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
|
4月前
|
网络协议 开发者 Python
深度探索Python Socket编程:从理论到实践,进阶篇带你领略网络编程的魅力!
【7月更文挑战第25天】在网络编程中, Python Socket编程因灵活性强而广受青睐。本文采用问答形式深入探讨其进阶技巧。**问题一**: Socket编程基于TCP/IP,通过创建Socket对象实现通信,支持客户端和服务器间的数据交换。**问题二**: 提升并发处理能力的方法包括多线程(适用于I/O密集型任务)、多进程(绕过GIL限制)和异步IO(asyncio)。**问题三**: 提供了一个使用asyncio库实现的异步Socket服务器示例,展示如何接收及响应客户端消息。通过这些内容,希望能激发读者对网络编程的兴趣并引导进一步探索。
56 4
|
4月前
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
【7月更文挑战第25天】在网络应用蓬勃发展的数字时代,Python凭借其简洁的语法和强大的库支持成为开发高效应用的首选。本文通过实时聊天室案例,介绍了Python Socket编程的基础与进阶技巧,包括服务器与客户端的建立、数据交换等基础篇内容,以及使用多线程和异步IO提升性能的进阶篇。基础示例展示了服务器端监听连接请求、接收转发消息,客户端连接服务器并收发消息的过程。进阶部分讨论了如何利用Python的`threading`模块和`asyncio`库来处理多客户端连接,提高应用的并发处理能力和响应速度。掌握这些技能,能使开发者在网络编程领域更加游刃有余,构建出高性能的应用程序。
34 3
下一篇
无影云桌面