samck中ProviderManager的学习
来源:互联网 发布:战地之王刷枪软件 编辑:程序博客网 时间:2024/05/22 01:46
首先要了解smack中两个客户端是如何交流的,它们通过连接服务器,通过服务器来进行交流。而客户端和服务器交流时,会打开一个<stream>流,通过在<stream>中加入一些包的xml信息进行交流,当断开后会用</stream>结束。
简单写一下:
<stream>
<message .....
<presence..
...
</stream>
而smack和openfire开源服务器都是用java实现的,java是面向对象的语言,如何将xml中的信息包,提取成对象呢,于是smack提供了ProciderManager。
而关于PrividerManager主要提供了两种提供者(我个人理解为解析器)
1.IQProvider 负责将stream流中iq请求解析成对象。
2.PacketExtensionProvider 将附属在在信息包(如message,IQ,presence)中含有的子文档解析成对象。
上面两个解析器都会讲元素名,命名空间,对应的类或Bean,被保存在你的JAR文件的META-INF目录下创建的smack.providers下。
ProviderManager pm = ProviderManager.getInstance();
IQProvider
在代码中的实现:
pm.addIQProvider("query", "jabber:iq:time",
Class.forName("org.jivesoftware.smackx.packet.Time"));//向smack.providers中注册
在smack.providers的存在形式:
<?xml version="1.0"?>
<smackProviders>
<iqProvider>
<elementName>query</elementName>
<namespace>jabber:iq:time</namespace>
<className>org.jivesoftware.smack.packet.Time</className>
</iqProvider>
</smackProviders>
在stream流解析的内容:<stream>
...
<iq type='result' to='joe@example.com' from='mary@example.com' id='time_1'>
<query xmlns='jabber:iq:time'>
<utc>20020910T17:58:35</utc>
<tz>MDT</tz>
<display>Tue Sep 10 12:58:35 2002</display>
</query>
</iq>
...
</stream>
以上的原理,通过向Provider实例中添加IQ解析器,将内容添加到smack.Providers文件中,当解析<stream>流中的iq包时,会将iq包的内容封装到一个实体中,当然,该实体必须有setUtc,setTx,setDisplay方法。IQProvider类可以实现IQProvider接口或继承IQ类,进行自己定义。
PacketExtensionProvider
在代码中的实现:
pm.addExtensionProvider("x", "jabber:x:roster",
new RosterExchangeProvider());//向smack.providers中注册
在smack.providers中存在的形式:
<smackProviders>
<extensionProvider>
<elementName>x</elementName>
<namespace>jabber:iq:event</namespace>
<className>org.jivesoftware.smack.packet.MessageEvent</className>
</extensionProvider>
</smackProviders>
在stream流中的信息包中
<iq type='result' to='joe@example.com' from='mary@example.com' id='time_1'>
<query xmlns='jabber:iq:time'>
<utc>20020910T17:58:35</utc>
<tz>MDT</tz>
<display>Tue Sep 10 12:58:35 2002</display>
</query>
<x xmlns='jabber:iq:event'>
<a>20020910T17:58:35</utc>
</x>
</iq>
在信息包中发现了子信息包,将向smack.providers中查找该子信息包的解析器,进行解析.IQProvider类可以实现PacketExtensionProvider接口或一个标准Bean,进行自己定义。借鉴的文章地址:http://blog.sina.com.cn/s/blog_54ef39890100ueq4.html
- samck中ProviderManager的学习
- smack中ProviderManager的学习
- 心急火燎的学习中
- Java学习中循环语句的学习
- 学习vue中关于SuperAgent的学习
- 深度学习--学习中存在的问题
- 游戏中脚本的应用(学习中)
- java中MySQL中JDBC的学习
- oracle中union的学习
- 学习Python中想到的
- 努力的学习C++中.....
- Spring中AOP的学习
- oracle中union的学习
- 学习中遇到的名词
- oracle中union的学习
- 学习python的中片言只语
- C++中string的学习
- Android中Service的学习
- 前往江湾景点
- C语言控制输出小数点位数
- 亮亮做加法 XDU1003
- 亚马逊给创业者5条建议:开会杜绝PPT
- Marriage Match III (hdu 3277 网络流+并查集+二分)
- samck中ProviderManager的学习
- House Robber - LeetCode 198
- zoj3785 What day is that day?
- 第四站 卧龙谷
- 从零到在虚拟机中搭建hadoop伪分布平台
- 判断是否为二叉树的后续遍历
- 第七题(3)
- smack中ProviderManager的学习
- SQLServer 递归查询