一、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推向市场,让更多的人使用。

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

团队网站: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。

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

  1. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  2. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  3. AgileEAS.NET SOA中间件平台/敏捷软件开发平台

    AgileEAS.NET SOA中间件平台/敏捷软件开发平台 最新下载 一.前言 AgileEAS.NET SOA中间件平台,简称EAS.NET,是基于敏捷并行开发思想和Microsoft .Net构 ...

  4. AgileEAS.NET SOA中间件平台更新日志 2015-04-28

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  5. AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(二):配置WinClient分布式运行环境

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  6. AgileEAS.NET SOA 中间件平台 5.2 发布说明-包含Silverlight及报表系统的开源代码下载

    一.AgileEAS.NET SOA 中间件简介      AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速 ...

  7. AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(四):开源的Silverlight运行容器的编译、配置

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  8. AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(三):配置ActiveXForm运行环境

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  9. 重写AgileEAS.NET SOA 中间件平台账号密码的加密算法

    一.平台简介 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适 ...

随机推荐

  1. base64格式的图片如何上传到oss

    ---恢复内容开始--- 对于base64图片的上传这个东西,一直是一个问题尤其是上传到oss.我们这次开发由于需要修剪图片,使用了h5的很多新特性. h5修剪图片,使用了我们的canvas.这个步骤 ...

  2. Scalaz(53)- scalaz-stream: 程序运算器-application scenario

    从上面多篇的讨论中我们了解到scalaz-stream代表一串连续无穷的数据或者程序.对这个数据流的处理过程就是一个状态机器(state machine)的状态转变过程.这种模式与我们通常遇到的程序流 ...

  3. Python绑定方法,未绑定方法,类方法,实例方法,静态方法

    >>> class foo(): clssvar=[1,2] def __init__(self): self.instance=[1,2,3] def hehe(self): pr ...

  4. 2014 Hangjs 见闻流水账第一天

    前言 6月21日~6月22日, 第一次跑远门去参加一个大会(广州 -> 杭州),本来打算,在火车的回来的路上,把这两天的东西记录一下,不过,火车上的环境实在恶劣,同时也高估了自己的专注力,所以, ...

  5. 组合数学 - 母函数的变形 --- hdu 1171:Big Event in HDU

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  6. Android 设计模式 之 单例模式

    http://blog.csdn.net/fangchongbory/article/details/7734199   目录(?)[+] 单例模式常见情景 首先实现1中的单例模式A 实现2中单例模式 ...

  7. thinkphp中I方法

    概述 正如你所见到的一样,I方法是ThinkPHP众多单字母函数中的新成员,其命名来自于英文Input(输入),主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:I('变量类型 ...

  8. ajax请求成功后打开新窗口地址

    转自:http://www.cnblogs.com/linjiqin/p/3148205.html jQuery.ajax({       "type":"post&qu ...

  9. zabbix监控MySQL

    通过使用mysql_performance_monitor软件包实现zabbix对mysql的监控. 1.安装依赖软件.yum install perl-File-Which perl-libwww- ...

  10. Java基础之一组有用的类——使用公历日历(TryCalendar)

    控制台程序. 公历是西方使用的日历,用GregorianCalendar类的对象来表示.GregorianCalendar对象封装了时区信息.日期和时间数据.GregorianCalendar对象有7 ...