分享

C#访问openfire服务器之三:一次成功的登录

 WindySky 2016-03-14

1、定义XmppClient

[csharp] view plain copy
在CODE上查看代码片派生到我的代码片
  1. public XmppClient(string pstrIp,int pIntPort,string pstrUser,string pstrPas)  
  2.       {  
  3.           //构造XmppClient  
  4.           xmpp = new XmppClientConnection(pstrIp);  
  5.   
  6.           xmpp.AutoAgents = false;  
  7.           xmpp.AutoPresence = true;  
  8.           xmpp.AutoRoster = true;  
  9.           xmpp.AutoResolveConnectServer = true;  
  10.           xmpp.Port = pIntPort;  
  11.           xmpp.Username = pstrUser;  
  12.           xmpp.Password = pstrPas;  
  13.           xmpp.ConnectServer = pstrIp;  
  14.   
  15.           m_strServerName = Dns.GetHostEntry(IPAddress.Parse(pstrIp)).HostName;  //获取服务器的计算机名  
  16.           xmpp.Server = m_strServerName;  
  17.   
  18.           //登录成功过程  
  19.           xmpp.OnSaslStart += new agsXMPP.sasl.SaslEventHandler(xmpp_OnSaslStart); //验证时触发  
  20.           xmpp.OnLogin += new ObjectHandler(xmppCon_OnLogin); //登录成功时触发  
  21.           xmpp.OnRosterItem += new XmppClientConnection.RosterHandler(xmpp_OnRosterItem); //当读取、添加、删除联系人时触发  
  22.           xmpp.OnPresence += new PresenceHandler(xmppCon_OnPresence); //收到Presence节时引发的事件  
  23.   
  24.           //消息处理  
  25.           xmpp.OnMessage += new MessageHandler(xmppCon_OnMessage); //消息事件  
  26.             
  27.           //错误处理  
  28.           xmpp.OnSocketError += new ErrorHandler(xmpp_OnSocketError); //找不到服务器时触发  
  29.           xmpp.OnError += new ErrorHandler(xmpp_OnError); //登录错误时触发  
  30.             
  31.           //关闭处理  
  32.           xmpp.OnClose += new ObjectHandler(xmpp_OnClose);  //网络中断或关闭事件  
  33.             
  34.       }  

2、初始化定义的xmppClient,然后打开连接

[csharp] view plain copy
在CODE上查看代码片派生到我的代码片
  1. xmppClient = new agsXMPPNet.XmppClient(psys.StrIp, psys.IntPort, psys.StrUser, psys.StrPas);  
  2.   
  3.                 xmppClient.OnPresenceEvent += new agsXMPPNet.XmppClient.OnPresence(xmppClient_OnPresenceEvent);  
  4.                 xmppClient.OnRosterItemEvent += new agsXMPPNet.XmppClient.OnRosterItem(xmppClient_OnRosterItemEvent);  
  5.   
  6.                 xmppClient.LoginEvent += new agsXMPPNet.XmppClient.MsgHandler(xmppClient_LoginEvent);  
  7.                 xmppClient.Login();  //这里其实就是xmpp.open()  

3、设置验证

[csharp] view plain copy
在CODE上查看代码片派生到我的代码片
  1. void xmpp_OnSaslStart(object sender, agsXMPP.sasl.SaslEventArgs args)  
  2.       {  
  3.           args.Auto = false;  
  4.           args.Mechanism = agsXMPP.protocol.sasl.Mechanism.GetMechanismName  
  5.               (agsXMPP.protocol.sasl.MechanismType.PLAIN);  
  6.       }  

4、登录成功事件

[csharp] view plain copy
在CODE上查看代码片派生到我的代码片
  1. void xmppCon_OnLogin(object sender)  
  2.        {  
  3.            RosterItem rt = new RosterItem  
  4.            {  
  5.                IsLoginSucc = true  
  6.            };  
  7.            LoginEvent(rt);  
  8.        }  

5、读取联系人

[csharp] view plain copy
在CODE上查看代码片派生到我的代码片
  1. /// <summary>  
  2.       /// 当读取、添加、删除联系人时触发  
  3.       /// </summary>  
  4.       /// <param name="sender"></param>  
  5.       /// <param name="item"></param>  
  6.       void xmpp_OnRosterItem(object sender, agsXMPP.protocol.iq.roster.RosterItem item)  
  7.       {  
  8.           if (item.Subscription == agsXMPP.protocol.iq.roster.SubscriptionType.both)   
  9.           {  
  10.               //对方也添加自己为好友  
  11.               OnRosterItemEvent(new RosterItem()  
  12.               {  
  13.                   //StrGroupName = item.GetGroups().Count > 0 ? item.GetGroups().Item(0).InnerXml : "",  
  14.                   StrUserName = item.Jid.User,  
  15.                   StrReMarkName = string.IsNullOrWhiteSpace(item.Name) == true ? item.Jid.User : item.Name,  
  16.                   RosterType=PreType.Both  
  17.               });  
  18.               m_intCount = 0;  
  19.           }  
  20.           else if(item.Subscription==agsXMPP.protocol.iq.roster.SubscriptionType.remove)  
  21.           {  
  22.               //删除(对方删除自己)  
  23.               OnRosterItemEvent(new RosterItem()  
  24.               {  
  25.                   //StrGroupName = item.GetGroups().Count > 0 ? item.GetGroups().Item(0).InnerXml : "",  
  26.                   StrUserName = item.Jid.User,  
  27.                   StrReMarkName = string.IsNullOrWhiteSpace(item.Name) == true ? item.Jid.User : item.Name,  
  28.                   RosterType = PreType.ReMove  
  29.               });  
  30.           }  
  31.       }  

6、收到Presence节,触发事件,进行列表展示

[csharp] view plain copy
在CODE上查看代码片派生到我的代码片
  1. /// <summary>  
  2.       /// 收到Presence节时引发的事件  
  3.       /// </summary>  
  4.       /// <param name="sender"></param>  
  5.       /// <param name="pres"></param>  
  6.       void xmppCon_OnPresence(object sender, Presence pres)  
  7.       {  
  8.           RosterItem rt = new RosterItem  
  9.           {  
  10.               StrFrom = pres.From.ToString(),  
  11.               StrUserName = pres.From.User,  
  12.               Server=pres.From.Server,  
  13.               Resource=pres.From.Resource,  
  14.               RosterType=(PreType)((int)pres.Type)  
  15.           };  
  16.   
  17.           //if(pres.To==null)  
  18.           OnPresenceEvent(rt);  
  19.       }  


至此,完成一个成功的登录过程。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多