基於XMPP協議的即時通訊工具的服務器端實現,下面將要來共同學習一下基於XMPP協議的即時通訊工具的客戶端實現原理,本篇將主要分析agsXMPPP客戶端用戶登錄認證的實現原理(關於XMPP協議與agsXMPP的相關知識請認真看第一篇中的附件)
1、主窗體初始化時將訂閱一大堆的事件
XmppCon.OnReadXml += new XmlHandler(XmppCon_OnReadXml);
//向服務器發送XML流信息
XmppCon.OnWriteXml += new XmlHandler(XmppCon_OnWriteXml);
XmppCon.OnRosterStart += new ObjectHandler(XmppCon_OnRosterStart);
XmppCon.OnRosterEnd += new ObjectHandler(XmppCon_OnRosterEnd);
XmppCon.OnRosterItem += new agsXMPP.XmppClientConnection.RosterHandler(XmppCon_OnRosterItem);
XmppCon.OnAgentStart += new ObjectHandler(XmppCon_OnAgentStart);
XmppCon.OnAgentEnd += new ObjectHandler(XmppCon_OnAgentEnd);
XmppCon.OnAgentItem += new agsXMPP.XmppClientConnection.AgentHandler(XmppCon_OnAgentItem);
//用戶登錄事件
XmppCon.OnLogin += new ObjectHandler(XmppCon_OnLogin);
//關閉連接事件
XmppCon.OnClose += new ObjectHandler(XmppCon_OnClose);
//連接錯誤事件
XmppCon.OnError += new ErrorHandler(XmppCon_OnError);
//收到Presence節時引發的事件
XmppCon.OnPresence += new agsXMPP.XmppClientConnection.PresenceHandler(XmppCon_OnPresence);
//收到Message節時引發的事件
XmppCon.OnMessage += new agsXMPP.XmppClientConnection.MessageHandler(XmppCon_OnMessage);
//收到IQ節時引發的事件
XmppCon.OnIq += new StreamHandler(XmppCon_OnIq);
//認證錯誤事件
XmppCon.OnAuthError += new OnXmppErrorHandler(XmppCon_OnAuthError);
//讀取Socket事件
XmppConSocket.OnReadSocketData += new agsXMPP.net.BaseSocket.OnSocketDataHandler(ClientSocket_OnReceive);
//寫入Socket事件
XmppCon.OnWriteSocketData += new agsXMPP.net.BaseSocket.OnSocketDataHandler(ClientSocket_OnSend);
XmppCon.ClientSocket.OnValidateCertificate += new System.Net.Security.RemoteCertificateValidationCallback(ClientSocket_OnValidateCertificate);
//連接狀態改變事件
XmppCon.OnXmppConnectionStateChanged += new agsXMPP.XmppClientConnection.XmppConnectionStateHandler(XmppCon_OnXmppConnectionStateChanged);
XmppCon.OnSaslStart += new SaslEventHandler(XmppCon_OnSaslStart);
窗體接收,和發送XML流時都不在UI線程中進行,這裏都是採用異步調用的方式發送和接收XML數據流,所以對發送和接收XML流數據時所引發的事件,如果需要更新到用戶界面,一定要將線程切換在UI線程,不然會出現一些莫名其妙的錯誤.
用戶輸入用戶名,密碼後將打開連接
{
frmLogin f = new frmLogin(XmppCon);
if (f.ShowDialog() == DialogResult.OK)
{
XmppCon.Open();
}
}
在這裏的 XmppCon.Open(); 將引發一系列的事件,並最終引發frmMain的XmppCon_OnWriteXml事件,向服務器端發送XML數據流,下面將重點說明這一系列的事件的引發過程:
我們先來看一下引發這一系引事件的流程圖
首先將高用OpenSocket()初發始化Socket連接並打開,在調用SocketConnect時將引發OnXmppConnectionStateChanged事件,初發始化Socket連接完成後將回調 EndConnect(IAsyncResult ar)並先引發OnConnect事件併發送XML數據流,在接行EndConnect時,如果拋出異常將引發OnError事件.調用Receive()完成後將回調EndReceive(IAsyncResult ar),然後引發OnReceive事件
這裏以後的交互過程,請參看<<.net平臺 基於 XMPP協議的即時消息服務端簡單實現>>一文中的"客戶端與服務器端的交互過程"