AgileEAS.NET SOA 中間件平臺.Net Socket通信框架-簡單例子-實現簡單的服務端客戶端消息應答

一、AgileEAS.NETSOA中間件Socket/Tcp框架介紹

在文章AgileEAS.NETSOA中間件平臺Socket/Tcp通信框架介紹一文之中我們對AgileEAS.NETSOA中間Socket/Tcp框架進行了總體的介紹,我們知道

AgileEAS.NETSOA中間件Socket/Tcp框架是一套Socket通信的消息中間件:

image_thumb2_thumb3

二、簡單例子-實現簡單的服務器客戶段消息應答

我們接下來實現一個簡單的例子,例子的場景非常的簡單,客戶端向服務端發送一個請求消息,服務段收到消息之後顯示消息內容,並對客戶端發送一個應答消息,客戶端收到應答消息之後顯示這個應答消息,對於本例子,我們使用WinForm應用來實現。

三、一步一步實現

首先我們下載AgileEAS.NETSOA中間件最新版本5.0/5.1,下載地址:http://www.smarteas.net/page/EAS_NET_Downloads.aspx

首先我們打開VS2010或者VS2010創建一個類爲項目Socket.Demo.Messages:

YHD7XBAITB_35QOK7_thumb3

刪除默認的Class1.cs,引用AgileEAS.NETSOA中間件的EAS.MicroKernel.dll程序集文件,然後添加一個類請求消息類RequestMessage:

1: [Serializable]
2: [Message("14DB99D2-190C-48E9-879A-EA833247F24A", "請求消息")]
3:publicclass RequestMessage:IMessage
4: {
5:///<summary>
6:///消息內容。
7:///</summary>
8:publicstring Content
9:     {
10:         get;
11:         set;
12:     }
13:
14:publicvoid Load(EAS.IO.BufferReader reader)
15:     {
16:this.Content = reader.ReadString();   
17:     }
18:
19:publicvoid 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:publicclass ResponseMessage : RequestMessage, IMessage
4: {
5: }

在本例子之中應答消息與請求消息其內容沒有本質的區別,都是文本通信,所以就直接繼承了RequestMessage,變更了MessageID和消息說明。

到此爲止,我們已經完成了請求消息與應答消息的定義Socket.Demo.Messages項目結構下:

KATXWNNI0IHYE_FII_thumb1

接下來我們來實現服務端程序,向解決方案添加一個Socket.Demo.Server的Windows窗體應用程序:

QQ20131011173059_thumb2

同樣,我們要引用AgileEAS.NETSOA中間件的EAS.MicroKernel.dll程序集文件,並且還要引用Socket.Demo.Messages項目,然後重命名Form1爲MainForm,並做以下界面佈局:

QQ20131011173717_thumb2

接下來我們向服務端加載請求消息的處理器RequestMessageHandler,用於服務端收到請求消息之後的處理動作:

1:class RequestMessageHandler:AbstractMessageHandler<RequestMessage>
2: {
3:publicoverridevoid 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:publicpartialclass MainForm : Form
15:     {
16:publicstatic 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:internalvoid 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:privatevoid 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:privatevoid 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>(newRequestMessageHandler());完成向服務器註冊請求消息的處理器對象,internalvoidShowMessage(Messages.RequestMessagemessage)方法用於顯示服務器收到的請求消息。

接下來我們來實現客戶端程序,向解決方案添加一個Socket.Demo.Client的Windows窗體應用程序,同前面一樣樣,我們要引用AgileEAS.NETSOA中間件的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:publicoverridevoid 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:publicpartialclass MainForm : Form
15:     {
16:publicstatic 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:internalvoid 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:privatevoid 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:privatevoid 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:privatevoid 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.NETSOA中間件平臺請通過AgilleEAS.NETSOA中站件平臺官方網站最新下載頁面下載。

六、聯繫我們

爲了完善、改進和推廣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(AgileEASSOA平臺)/上限1000人

199463175(AgileEASSOA交流)/上限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人

郵件:[email protected],[email protected],

電話:18629261335。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章