smack中ProviderManager的学习

来源:互联网 发布:战地之王刷枪软件 编辑:程序博客网 时间:2024/05/18 01:23

首先要了解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

0 0