• 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通信的消息中间件:

    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("
    ");
      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("
    ");
      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.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。

  • 相关阅读:
    mysql操作规范
    在线修改大表结构pt-online-schema-change
    MySQL 过滤复制
    IDEA “Cannot resolve symbol” 解决办法
    JAVA NIO Selector Channel
    Mysql二级索引
    技术选型关于redis客户端选择
    知乎上看到的一篇讲解Epoll的文章,较形象生动
    linux安装运行virtuoso数据库的详细过程
    go安装步骤(linux和Windows)
  • 原文地址:https://www.cnblogs.com/eastjade/p/3371631.html
Copyright © 2020-2023  润新知