本文來自http://blog.csdn.net/hellogv/
XMPP是一個開源的IM通訊協定,用戶端與伺服器都開源,並且都有主流開發語言的支援。目前有很多基於XMPP的IM,可以到http://www.jabber.org/
註冊XMPP的帳號和下載IM。這些IM的用戶端,可以登入絕大多數基於XMPP通訊協定的IM伺服器,舉個例子:A公司的IM-A通訊軟體,和B公司的IM-B通訊軟體都是基於XMPP通訊協定,那麼IM-A用戶端可以登入IM-B的伺服器。。。
agsXMPP是XMPP用戶端的C#實現,支援WM手機和PC,agsXMPP的例子代碼不難(這裡下載:http://www.ag-software.de/download.html
),但是agsXMPP的注釋不多,所以比較難理解,本文就解釋一下agsXMPP例子中核心的部分:事件處理
以下代碼來自我的當前項目,因此不能全部貼出代碼,只貼出代碼結構,用於解釋常用的事件處理:
/// <summary><br /> /// 更新好友名單的事件<br /> /// </summary><br /> private void XmppCon_OnRosterItem(object sender, agsXMPP.protocol.iq.roster.RosterItem item)<br /> {<br /> if (ucContactList.InvokeRequired)<br /> {<br /> ucContactList.BeginInvoke(new agsXMPP.XmppClientConnection.RosterHandler(XmppCon_OnRosterItem), new object[] { this, item });<br /> return;<br /> }<br /> /*<br /> 1、 None——Jabber使用者和連絡人互相都不訂閱對方的presence<br /> 2、 To——Jabber使用者被連絡人的presence訂閱,但連絡人並不被Jabber使用者的presence訂閱。<br /> 3、 From——連絡人接受來自Jabber使用者的subscription,但連絡人不被Jabber使用者的presence所訂閱(這樣的結果就是Jabber使用者在連絡人的花名冊中“不可見”)。<br /> 4、 Both——Jabber使用者和連絡人被彼此的presence訂閱。<br /> */<br /> if (item.Subscription == SubscriptionType.both)//當item所表示的好友都彼此加為好友<br /> {<br /> //添加到好友名單<br /> }<br /> }<br /> delegate void OnPresenceDelegate(object sender, Presence pres);<br /> /// <summary><br /> /// 收到Presence節時引發的事件,判斷使用者上線/離線觸發,以及使用者處理好友請求(拒絕/接受)、被T處理<br /> /// </summary><br /> private void XmppCon_OnPresence(object sender, Presence pres)<br /> {<br /> if (ucContactList.InvokeRequired)<br /> {<br /> ucContactList.BeginInvoke(new OnPresenceDelegate(XmppCon_OnPresence), new object[] { sender, pres });<br /> return;<br /> }<br /> //****************處理好友請求************************//<br /> if (pres.Type == PresenceType.subscribe)//收到好友請求<br /> {<br /> //提問使用者是否接受好友請求<br /> }<br /> else if (pres.Type == PresenceType.subscribed) { }<br /> else if (pres.Type == PresenceType.unsubscribe) {}<br /> else if (pres.Type == PresenceType.unsubscribed)//收到“拒絕請求”或者“被T”的時候<br /> {</p><p> }<br /> else //處理好友上線/離線的事件處理<br /> {<br /> if (pres.From.Bare.Equals(Cls_Config.XmppCon.MyJID.Bare) == false)//如果不是自己的資訊,即好友資訊<br /> {<br /> //檢測該好友是否不存在於好友名單(OnPresence比OnRosterItem優先處理添加好友),則自動添加ListItem<br /> if (Cls_Config.alFriendsList.IndexOf(pres.From.Bare) == -1)<br /> {<br /> //添加到好友名單<br /> }<br /> //判斷該好友目前的狀態,上線還是離線<br /> if (pres.Type == PresenceType.available)//如果好友上線<br /> {}<br /> else if (pres.Type == PresenceType.unavailable)//如果好友離線<br /> {}<br /> }<br /> }<br /> }<br /> /// <summary><br /> /// 登陸時觸發的事件<br /> /// </summary><br /> private void XmppCon_OnLogin(object sender)<br /> {<br /> if (ucContactList.InvokeRequired)<br /> {<br /> ucContactList.BeginInvoke(new agsXMPP.ObjectHandler(XmppCon_OnLogin), new object[] { sender });<br /> return;<br /> }<br /> //通知好友,我已經上線了<br /> Presence p = new Presence(ShowType.chat, "Online");<br /> p.Type = PresenceType.available;<br /> Cls_Config.XmppCon.Send(p);<br /> }<br /> /// <summary><br /> /// 關閉串連時觸發的事件<br /> /// </summary><br /> private void XmppCon_OnClose(object sender)<br /> {<br /> if (ucContactList.InvokeRequired)<br /> {<br /> ucContactList.BeginInvoke(new agsXMPP.ObjectHandler(XmppCon_OnClose), new object[] { sender });<br /> return;<br /> }<br /> //通知好友,我下線啦<br /> Presence p = new Presence(ShowType.chat, "Offline");<br /> p.Type = PresenceType.unavailable;<br /> Cls_Config.XmppCon.Send(p);<br /> }</p><p> delegate void OnMessageDelegate(object sender, agsXMPP.protocol.client.Message msg);<br /> /// <summary><br /> /// 當收到資訊的時候,觸發的事件<br /> /// </summary><br /> private void XmppCon_OnMessage(object sender, agsXMPP.protocol.client.Message msg)<br /> {<br /> if (ucContactList.InvokeRequired)<br /> {<br /> ucContactList.BeginInvoke(new OnMessageDelegate(XmppCon_OnMessage), new object[] { sender, msg });<br /> return;<br /> }<br /> if (msg.Type == MessageType.chat)//判斷聊天類型<br /> {<br /> //如果還沒與該好友對話<br /> //則建立聊天視窗<br /> //已經存在聊天視窗,<br /> //則把內容傳到聊天視窗顯示<br /> }</p><p> }