AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答
一、AgileEAS.NET SOA中间件Socket/Tcp框架介绍
在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA中间Socket/Tcp框架进行了总体的介绍,我们知道
AgileEAS.NET SOA中间件Socket/Tcp框架是一套Socket通信的消息中间件:
二、简单例子-实现简单的服务器客户段消息应答
我们接下来实现一个简单的例子,例子的场景非常的简单,客户端向服务端发送一个请求消息,服务段收到消息之后显示消息内容,并对客户端发送一个应答消息,客户端收到应答消息之后显示这个应答消息,对于本例子,我们使用WinForm应用来实现。
三、一步一步实现
首先我们下载AgileEAS.NET SOA 中间件最新版本5.0/5.1,下载地址:http://www.smarteas.net/page/EAS_NET_Downloads.aspx。
首先我们打开VS2010或者VS2010创建一个类为项目Socket.Demo.Messages:
删除默认的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项目结构下:
接下来我们来实现服务端程序,向解决方案添加一个Socket.Demo.Server的Windows窗体应用程序:
同样,我们要引用AgileEAS.NET SOA 中间件的EAS.MicroKernel.dll程序集文件,并且还要引用Socket.Demo.Messages项目,然后重命名Form1为MainForm,并做以下界面布局:
接下来我们向服务端加载请求消息的处理器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,并做以下界面布局:
接下来我们向客户端加载应答消息的处理器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,这个简单的例子我们已经开发完成了,接下来,我们来编译、测试一下这个例子!
四、运行测试
首先我们启动服务端程序、启动服务器,然后启动客户段并连接服务器,从客户段向服务器发送消息,服务端会显示客户端发送的消息会向客户端发送一个应答消息。
五、本例源代码下载
本文例子源代码请通过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推向市场,让更多的人使用。
我的技术团队成员都是合作多年的老朋友,因为这个平台是免费的,所以也没有什么收入,都是由程序员的那种理想与信念坚持,在此我感谢一起奋斗的朋友。
AgileEAS.NET网站:http://www.agileeas.net
官方博客:http://eastjade.cnblogs.com
github:https://github.com/agilelab/eas
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。
AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答的更多相关文章
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- AgileEAS.NET SOA中间件平台/敏捷软件开发平台
AgileEAS.NET SOA中间件平台/敏捷软件开发平台 最新下载 一.前言 AgileEAS.NET SOA中间件平台,简称EAS.NET,是基于敏捷并行开发思想和Microsoft .Net构 ...
- AgileEAS.NET SOA中间件平台更新日志 2015-04-28
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(二):配置WinClient分布式运行环境
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- AgileEAS.NET SOA 中间件平台 5.2 发布说明-包含Silverlight及报表系统的开源代码下载
一.AgileEAS.NET SOA 中间件简介 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速 ...
- AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(四):开源的Silverlight运行容器的编译、配置
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(三):配置ActiveXForm运行环境
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- 重写AgileEAS.NET SOA 中间件平台账号密码的加密算法
一.平台简介 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适 ...
随机推荐
- ARM处理器解析
按图分析: ARM处理器有七种工作模式,为的是形成不同的使用级别,以防造成对系统的破坏.不同模式可以访问的寄存器不同,可以运行的指令不同. (1)user(10000):普通应用程序运行的模式(应用程 ...
- 百度地图API简单应用
在做移动端应用时经常用到百度地图API,百度API有强大的示例和文档,开发之前去百度相关网站注册密钥,很块博主只花了几分钟 百度地图API范例 百度地图API文档说明 例子1:输入特定关键字绘制地图标 ...
- ios图文混排
图文混排的形式 1. 富文本形式 2. core Text(文字排版) 3. TextKit 4. UIWebView 一.富文本 我们可以采用attributeString来进行图文混排.例如一个文 ...
- fzoj1314 You are my brother
题目描述 Little A gets to know a new friend, Little B, recently. One day, they realize that they are fam ...
- Alpha版本十天冲刺——Day 10
站立式会议 最后一天,很高兴我们做出了跟预期差不多的版本,实现了基本功能,虽然还有一些bug,但是下一阶段我们会继续加油! 会议总结 队员 今天完成 遇到的问题 感想 鲍亮 功能细节更改 我的手机运行 ...
- nginx实现请求转发
反向代理适用于很多场合,负载均衡是最普遍的用法. nginx 作为目前最流行的web服务器之一,可以很方便地实现反向代理. nginx 反向代理官方文档: NGINX REVERSE PROXY 当在 ...
- MongoDB C Driver使用教程
MongoDB C Driver使用教程 转载请注明出处http://www.cnblogs.com/oloroso/ 本指南提供简介 MongoDB C 驱动程序. 在 C API 的详细信息,请参 ...
- CPU时间片
CPU时间片 为了提高程序执行效率,大家在很多应用中都采用了多线程模式,这样可以将原来的序列化执行变为并行执行,任务的分解以及并行执行能够极大地提高程序的运行效率. 但这都是代码级别的表现,而硬件是如 ...
- spring jpa 实体互相引用返回restful数据循环引用报错的问题
spring jpa 实体互相引用返回restful数据循环引用报错的问题 Java实体里两个对象有关联关系,互相引用,比如,在一对多的关联关系里 Problem对象,引用了标签列表ProblemLa ...
- [Linux][PHP]安装swoole扩展
1.下载swoole 2.解压并配置 /usr/local/php/bin/phpize ./configure --enable-swoole-debug --enable-sockets --en ...