AgileEAS.NET SOA 中介軟體平臺.Net Socket通訊框架-簡單例子-實現簡單的服務端客戶端訊息應答
一、AgileEAS.NET SOA中介軟體Socket/Tcp框架介紹
AgileEAS.NET SOA中介軟體Socket/Tcp框架是一套Socket通訊的訊息中介軟體:
二、簡單例子-實現簡單的伺服器客戶段訊息應答
我們接下來實現一個簡單的例子,例子的場景非常的簡單,客戶端向服務端傳送一個請求訊息,服務段收到訊息之後顯示訊息內容,並對客戶端傳送一個應答訊息,客戶端收到應答訊息之後顯示這個應答訊息,對於本例子,我們使用WinForm應用來實現。
三、一步一步實現
首先我們開啟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,這個簡單的例子我們已經開發完成了,接下來,我們來編譯、測試一下這個例子!
四、執行測試
首先我們啟動服務端程式、啟動伺服器,然後啟動客戶段並連線伺服器,從客戶段向伺服器傳送訊息,服務端會顯示客戶端傳送的訊息會向客戶端傳送一個應答訊息。
五、本例原始碼下載
六、聯絡我們
為了完善、改進和推廣AgileEAS.NET而成立了敏捷軟體工程實驗室,是一家研究、推廣和發展新技術,並致力於提供具有自主智慧財產權的業務基礎平臺軟體,以及基於業務基礎平臺了開發的管理軟體的專業軟體提供商。主要業務是為客戶提供軟體企業研發管理解決方案、企業管理軟體開發,以及相關的技術支援,管理及技術諮詢與培訓業務。
AgileEAS.NET平臺自2004年秋呱呱落地一來,我就一直在逐步完善和改進,也被應用於保險、醫療、電子商務、房地產、鐵路、教育等多個應用,但一直都是以我個人在推廣,2010年因為我辭職休息,我就想到把AgileEAS.NET推向市場,讓更多的人使用。
我的技術團隊成員都是合作多年的老朋友,因為這個平臺是免費的,所以也沒有什麼收入,都是由程式設計師的那種理想與信念堅持,在此我感謝一起奮鬥的朋友。
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人
郵件:[email protected],[email protected],
電話:18629261335。