创建agsXMPP 自定义packet types

在网上看了好多文章基本都是转载 没有能成功运行的,又没有别的资料,很是费解,无奈之下只好潜心研究,最终总结了几个要点给大家分享下,以免再次多浪费时间

agsXMPP是什么就不多描述了,重点说下我在创建自定义包时注意的地方

先看使用方式:

1 使用IQ的tag为类名的方式,自定义包代码如下

using agsXMPP.Xml.Dom;
public class UserCustom : Element
{
    public UserCustom()
    {
        base.TagName = "UserCustom";//第一种方式这个地方要和类名相同
     this.Namespace = "agsoftware:UserCustom"; } public string MsgString { get { return base.GetTag("MsgString"); } set { base.SetTag("MsgString", value); } } }

然后在元素工厂中注册这个新类。如果不注册,在解析XML流时XML解析器就不会生成自定义对象。

 agsXMPP.Factory.ElementFactory.AddElementType("UserCustom", "agsoftware:UserCustom", typeof(UserCustom));

注意:以上两段代码中红底的地方一定一致!如果你发现service端创建的是agsXMPP.Xml.Element的一个实例,那就要检查一下这两个地方

然后是发送代码:

            UserCustom uc = new UserCustom();
            uc.MsgString = "这个是自定义消息:" + rtb_send.Text;
            IQ iq = new IQ();
            iq.AddChild(uc);
            iq.To = new Jid(name, "localhost", "resourse");
            iq.Type = IqType.get;
            con.Send(iq);

service端

        private void streamParser_OnStreamElement(object sender, Node e)
        {
             if (e.GetType() == typeof(IQ))
             {
          IQ iq = e as IQ;
if (iq.HasTag(typeof(UserCustom))) { //逻辑处理 } } }

2 使用IQ的tag为query的方式,自定义包代码如下

using agsXMPP.Xml.Dom;
public class UserCustom : Element
{
    public UserCustom()
    {
        base.TagName = "query";//注意这个位置
        this.Namespace = "agsoftware:UserCustom";
    }
    public string MsgString
    {
        get
        {
            return base.GetTag("MsgString");
        }
        set
        {
            base.SetTag("MsgString", value);
        }

    }
}

然后在元素工厂中按如下方式注册这个新类

agsXMPP.Factory.ElementFactory.AddElementType("query", "agsoftware:UserCustom", typeof(UserCustom));

注意:标红的代码,否则服务端总是创建的agsXMPP.Xml.Element实例

发送代码是一样的,服务端代码如下

        private void streamParser_OnStreamElement(object sender, Node e)
        {
             if (e.GetType() == typeof(IQ))
             {
          IQ iq = e as IQ;
                 if (iq.Query != null)
                 {
                     if (iq.Query.GetType() == typeof(UserCustom))
                       {
                           //逻辑处理
                       }    
              }
             }
         }

以上纯个人见解,如有误导请多包涵,还望高手多多指教~

本文只是简单的说明下在自定义包时注意事项,如有其他不明白的地方可以参照网上其他资料详细了解下,我也是刚刚学习agsXMPP,希望与大家多多交流

原文地址:https://www.cnblogs.com/huzhenchao/p/3270053.html