samck中ProviderManager的学习

本文深入解读了Smack框架下客户端如何通过连接服务器进行交流,重点阐述了通过<stream>流进行信息传递的过程。详细介绍了如何使用Java实现的面向对象语言,将XML中的信息包解析成对象,特别是通过IQProvider和PacketExtensionProvider实现的解析过程。文章还详细解释了这两个解析器的工作原理及其实现方式,包括如何在smack.providers文件中注册解析器,并通过示例展示了解析流中IQ包和信息包中的子文档内容。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code_wang_hui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值