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

1、定义XmppClient

  public XmppClient(string pstrIp,int pIntPort,string pstrUser,string pstrPas)
        {
            //构造XmppClient
            xmpp = new XmppClientConnection(pstrIp);

            xmpp.AutoAgents = false;
            xmpp.AutoPresence = true;
            xmpp.AutoRoster = true;
            xmpp.AutoResolveConnectServer = true;
            xmpp.Port = pIntPort;
            xmpp.Username = pstrUser;
            xmpp.Password = pstrPas;
            xmpp.ConnectServer = pstrIp;

            m_strServerName = Dns.GetHostEntry(IPAddress.Parse(pstrIp)).HostName;  //获取服务器的计算机名
            xmpp.Server = m_strServerName;

            //登录成功过程
            xmpp.OnSaslStart += new agsXMPP.sasl.SaslEventHandler(xmpp_OnSaslStart); //验证时触发
            xmpp.OnLogin += new ObjectHandler(xmppCon_OnLogin); //登录成功时触发
            xmpp.OnRosterItem += new XmppClientConnection.RosterHandler(xmpp_OnRosterItem); //当读取、添加、删除联系人时触发
            xmpp.OnPresence += new PresenceHandler(xmppCon_OnPresence); //收到Presence节时引发的事件

            //消息处理
            xmpp.OnMessage += new MessageHandler(xmppCon_OnMessage); //消息事件
            
            //错误处理
            xmpp.OnSocketError += new ErrorHandler(xmpp_OnSocketError); //找不到服务器时触发
            xmpp.OnError += new ErrorHandler(xmpp_OnError); //登录错误时触发
            
            //关闭处理
            xmpp.OnClose += new ObjectHandler(xmpp_OnClose);  //网络中断或关闭事件
            
        }

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

xmppClient = new agsXMPPNet.XmppClient(psys.StrIp, psys.IntPort, psys.StrUser, psys.StrPas);

                xmppClient.OnPresenceEvent += new agsXMPPNet.XmppClient.OnPresence(xmppClient_OnPresenceEvent);
                xmppClient.OnRosterItemEvent += new agsXMPPNet.XmppClient.OnRosterItem(xmppClient_OnRosterItemEvent);

                xmppClient.LoginEvent += new agsXMPPNet.XmppClient.MsgHandler(xmppClient_LoginEvent);
                xmppClient.Login();  //这里其实就是xmpp.open()

3、设置验证

  void xmpp_OnSaslStart(object sender, agsXMPP.sasl.SaslEventArgs args)
        {
            args.Auto = false;
            args.Mechanism = agsXMPP.protocol.sasl.Mechanism.GetMechanismName
                (agsXMPP.protocol.sasl.MechanismType.PLAIN);
        }

4、登录成功事件

 void xmppCon_OnLogin(object sender)
        {
            RosterItem rt = new RosterItem
            {
                IsLoginSucc = true
            };
            LoginEvent(rt);
        }

5、读取联系人

  /// <summary>
        /// 当读取、添加、删除联系人时触发
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="item"></param>
        void xmpp_OnRosterItem(object sender, agsXMPP.protocol.iq.roster.RosterItem item)
        {
            if (item.Subscription == agsXMPP.protocol.iq.roster.SubscriptionType.both) 
            {
                //对方也添加自己为好友
                OnRosterItemEvent(new RosterItem()
                {
                    //StrGroupName = item.GetGroups().Count > 0 ? item.GetGroups().Item(0).InnerXml : "",
                    StrUserName = item.Jid.User,
                    StrReMarkName = string.IsNullOrWhiteSpace(item.Name) == true ? item.Jid.User : item.Name,
                    RosterType=PreType.Both
                });
                m_intCount = 0;
            }
            else if(item.Subscription==agsXMPP.protocol.iq.roster.SubscriptionType.remove)
            {
                //删除(对方删除自己)
                OnRosterItemEvent(new RosterItem()
                {
                    //StrGroupName = item.GetGroups().Count > 0 ? item.GetGroups().Item(0).InnerXml : "",
                    StrUserName = item.Jid.User,
                    StrReMarkName = string.IsNullOrWhiteSpace(item.Name) == true ? item.Jid.User : item.Name,
                    RosterType = PreType.ReMove
                });
            }
        }

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

  /// <summary>
        /// 收到Presence节时引发的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="pres"></param>
        void xmppCon_OnPresence(object sender, Presence pres)
        {
            RosterItem rt = new RosterItem
            {
                StrFrom = pres.From.ToString(),
                StrUserName = pres.From.User,
                Server=pres.From.Server,
                Resource=pres.From.Resource,
                RosterType=(PreType)((int)pres.Type)
            };

            //if(pres.To==null)
            OnPresenceEvent(rt);
        }


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值