PC/WM手机的IM客户端设计-----agsXMPP

本文详细解析了XMPP即时通讯协议及其在agsXMPP中的C#实现,重点介绍了事件处理机制,包括好友列表更新、在线状态变化、消息接收及登录退出等关键事件的处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

               

本文来自http://blog.youkuaiyun.com/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>    /// 更新好友列表的事件    /// </summary>    private void XmppCon_OnRosterItem(object sender, agsXMPP.protocol.iq.roster.RosterItem item)    {        if (ucContactList.InvokeRequired)        {            ucContactList.BeginInvoke(new agsXMPP.XmppClientConnection.RosterHandler(XmppCon_OnRosterItem), new object[] { this, item });            return;        }        /*          1、 None——Jabber用户和联系人互相都不订阅对方的presence      2、 To——Jabber用户被联系人的presence订阅,但联系人并不被Jabber用户的presence订阅。      3、 From——联系人接受来自Jabber用户的subscription,但联系人不被Jabber用户的presence所订阅(这样的结果就是Jabber用户在联系人的花名册中“不可见”)。      4、 Both——Jabber用户和联系人被彼此的presence订阅。         */        if (item.Subscription == SubscriptionType.both)//当item所表示的好友都彼此加为好友        {           //添加到好友列表        }    }    delegate void OnPresenceDelegate(object sender, Presence pres);    /// <summary>    /// 收到Presence节时引发的事件,判断用户上线/离线触发,以及用户处理好友请求(拒绝/接受)、被T处理    /// </summary>    private void XmppCon_OnPresence(object sender, Presence pres)    {        if (ucContactList.InvokeRequired)        {            ucContactList.BeginInvoke(new OnPresenceDelegate(XmppCon_OnPresence), new object[] { sender, pres });            return;        }        //****************处理好友请求************************//        if (pres.Type == PresenceType.subscribe)//收到好友请求        {           //提问用户是否接受好友请求        }        else if (pres.Type == PresenceType.subscribed) { }        else if (pres.Type == PresenceType.unsubscribe) {}        else if (pres.Type == PresenceType.unsubscribed)//收到“拒绝请求”或者“被T”的时候        {                    }        else //处理好友上线/离线的事件处理        {            if (pres.From.Bare.Equals(Cls_Config.XmppCon.MyJID.Bare) == false)//如果不是自己的信息,即好友信息            {                 //检测该好友是否不存在于好友列表(OnPresence比OnRosterItem优先处理添加好友),则自动添加ListItem                 if (Cls_Config.alFriendsList.IndexOf(pres.From.Bare) == -1)                 {                     //添加到好友列表                 }                 //判断该好友目前的状态,上线还是离线                 if (pres.Type == PresenceType.available)//如果好友上线                 {}                 else if (pres.Type == PresenceType.unavailable)//如果好友离线                 {}            }        }    }    /// <summary>    /// 登陆时触发的事件    /// </summary>    private void XmppCon_OnLogin(object sender)    {        if (ucContactList.InvokeRequired)        {            ucContactList.BeginInvoke(new agsXMPP.ObjectHandler(XmppCon_OnLogin), new object[] { sender });            return;        }        //通知好友,我已经上线了        Presence p = new Presence(ShowType.chat, "Online");        p.Type = PresenceType.available;        Cls_Config.XmppCon.Send(p);    }    /// <summary>    /// 关闭连接时触发的事件    /// </summary>    private void XmppCon_OnClose(object sender)    {        if (ucContactList.InvokeRequired)        {            ucContactList.BeginInvoke(new agsXMPP.ObjectHandler(XmppCon_OnClose), new object[] { sender });            return;        }        //通知好友,我下线啦        Presence p = new Presence(ShowType.chat, "Offline");        p.Type = PresenceType.unavailable;        Cls_Config.XmppCon.Send(p);    }    delegate void OnMessageDelegate(object sender, agsXMPP.protocol.client.Message msg);    /// <summary>    /// 当收到信息的时候,触发的事件    /// </summary>    private void XmppCon_OnMessage(object sender, agsXMPP.protocol.client.Message msg)    {        if (ucContactList.InvokeRequired)        {            ucContactList.BeginInvoke(new OnMessageDelegate(XmppCon_OnMessage), new object[] { sender, msg });            return;        }        if (msg.Type == MessageType.chat)//判断聊天类型        {            //如果还没与该好友对话                     //则新建聊天窗口            //已经存在聊天窗口,                     //则把内容传到聊天窗口显示        }          }

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值