agsxmpp源码分析

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例子中核心的部分:事件处理

以下代码来自我的当前项目,因此不能全部贴出代码,只贴出代码结构,用于解释常用的事件处理:

C-sharp代码 复制代码
  1. /// <summary> 
  2. /// 更新好友列表的事件 
  3. /// </summary> 
  4. privatevoid XmppCon_OnRosterItem(object sender, agsXMPP.protocol.iq.roster.RosterItem item) 
  5.     if (ucContactList.InvokeRequired) 
  6.     { 
  7.         ucContactList.BeginInvoke(new agsXMPP.XmppClientConnection.RosterHandler(XmppCon_OnRosterItem), newobject[] { this, item }); 
  8.         return
  9.     } 
  10.     /*
  11.       1、 None——Jabber用户和联系人互相都不订阅对方的presence
  12.   2、 To——Jabber用户被联系人的presence订阅,但联系人并不被Jabber用户的presence订阅。
  13.   3、 From——联系人接受来自Jabber用户的subscription,但联系人不被Jabber用户的presence所订阅(这样的结果就是Jabber用户在联系人的花名册中“不可见”)。
  14.   4、 Both——Jabber用户和联系人被彼此的presence订阅。
  15.      */ 
  16.     if (item.Subscription == SubscriptionType.both)//当item所表示的好友都彼此加为好友 
  17.     { 
  18.        //添加到好友列表 
  19.     } 
  20. delegatevoid OnPresenceDelegate(object sender, Presence pres); 
  21. /// <summary> 
  22. /// 收到Presence节时引发的事件,判断用户上线/离线触发,以及用户处理好友请求(拒绝/接受)、被T处理 
  23. /// </summary> 
  24. privatevoid XmppCon_OnPresence(object sender, Presence pres) 
  25.     if (ucContactList.InvokeRequired) 
  26.     { 
  27.         ucContactList.BeginInvoke(new OnPresenceDelegate(XmppCon_OnPresence), newobject[] { sender, pres }); 
  28.         return
  29.     } 
  30.     //****************处理好友请求************************// 
  31.     if (pres.Type == PresenceType.subscribe)//收到好友请求 
  32.     { 
  33.        //提问用户是否接受好友请求 
  34.     } 
  35.     elseif (pres.Type == PresenceType.subscribed) { } 
  36.     elseif (pres.Type == PresenceType.unsubscribe) {} 
  37.     elseif (pres.Type == PresenceType.unsubscribed)//收到“拒绝请求”或者“被T”的时候 
  38.     { 
  39.          
  40.     } 
  41.     else//处理好友上线/离线的事件处理 
  42.     { 
  43.         if (pres.From.Bare.Equals(Cls_Config.XmppCon.MyJID.Bare) == false)//如果不是自己的信息,即好友信息 
  44.         { 
  45.              //检测该好友是否不存在于好友列表(OnPresence比OnRosterItem优先处理添加好友),则自动添加ListItem 
  46.              if (Cls_Config.alFriendsList.IndexOf(pres.From.Bare) == -1) 
  47.              { 
  48.                  //添加到好友列表 
  49.              } 
  50.              //判断该好友目前的状态,上线还是离线 
  51.              if (pres.Type == PresenceType.available)//如果好友上线 
  52.              {} 
  53.              elseif (pres.Type == PresenceType.unavailable)//如果好友离线 
  54.              {} 
  55.         } 
  56.     } 
  57. /// <summary> 
  58. /// 登陆时触发的事件 
  59. /// </summary> 
  60. privatevoid XmppCon_OnLogin(object sender) 
  61.     if (ucContactList.InvokeRequired) 
  62.     { 
  63.         ucContactList.BeginInvoke(new agsXMPP.ObjectHandler(XmppCon_OnLogin), newobject[] { sender }); 
  64.         return
  65.     } 
  66.     //通知好友,我已经上线了 
  67.     Presence p = new Presence(ShowType.chat, "Online"); 
  68.     p.Type = PresenceType.available; 
  69.     Cls_Config.XmppCon.Send(p); 
  70. /// <summary> 
  71. /// 关闭连接时触发的事件 
  72. /// </summary> 
  73. privatevoid XmppCon_OnClose(object sender) 
  74.     if (ucContactList.InvokeRequired) 
  75.     { 
  76.         ucContactList.BeginInvoke(new agsXMPP.ObjectHandler(XmppCon_OnClose), newobject[] { sender }); 
  77.         return
  78.     } 
  79.     //通知好友,我下线啦 
  80.     Presence p = new Presence(ShowType.chat, "Offline"); 
  81.     p.Type = PresenceType.unavailable; 
  82.     Cls_Config.XmppCon.Send(p); 
  83.  
  84. delegatevoid OnMessageDelegate(object sender, agsXMPP.protocol.client.Message msg); 
  85. /// <summary> 
  86. /// 当收到信息的时候,触发的事件 
  87. /// </summary> 
  88. privatevoid XmppCon_OnMessage(object sender, agsXMPP.protocol.client.Message msg) 
  89.     if (ucContactList.InvokeRequired) 
  90.     { 
  91.         ucContactList.BeginInvoke(new OnMessageDelegate(XmppCon_OnMessage), newobject[] { sender, msg }); 
  92.         return
  93.     } 
  94.     if (msg.Type == MessageType.chat)//判断聊天类型 
  95.     { 
  96.         //如果还没与该好友对话 
  97.                  //则新建聊天窗口 
  98.         //已经存在聊天窗口, 
  99.                  //则把内容传到聊天窗口显示 
  100.     } 
  101.    
posted @ 2012-06-25 17:20  平民总有崛起的时候  阅读(2928)  评论(0编辑  收藏  举报