基於XMPP協議的即時通訊工具的服務器端實現

 基於XMPP協議的即時通訊工具的服務器端實現,下面將要來共同學習一下基於XMPP協議的即時通訊工具的客戶端實現原理,本篇將主要分析agsXMPPP客戶端用戶登錄認證的實現原理(關於XMPP協議與agsXMPP的相關知識請認真看第一篇中的附件)
1、主窗體初始化時將訂閱一大堆的事件

  // 讀取接收到的XML流信息
            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線程,不然會出現一些莫名其妙的錯誤.

用戶輸入用戶名,密碼後將打開連接

 private void connectToolStripMenuItem_Click(object sender, EventArgs e)
        {
            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協議的即時消息服務端簡單實現>>一文中的"客戶端與服務器端的交互過程"

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