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