`
tw5566
  • 浏览: 457823 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

在smack中实现 Jabber-RPC (XEP-0009)

阅读更多
1.首先扩展一个IQ: 
源代码来自: 
java代码为: 
http://cvs.codehaus.org/viewrep/groovy/groovy/modules/xmlrpc/src/main...

import org.jivesoftware.smack.packet.IQ; 


/** 
 * @author John Wilson 
 * 
 */ 


public class JabberRPC extends IQ { 


        private final String xml; 


        public JabberRPC(final String xml) { 
                this.xml = "<query xmlns='jabber:iq:rpc'>\n" + xml + "\n</query>"; 
        } 


        public String getChildElementXML() { 
                return this.xml; 
        } 


} 


2.扩展一个IQProvider. 
源代码来自: 
http://cvs.codehaus.org/viewrep/groovy/groovy/modules/xmlrpc/src/main...
java代码为: 
import org.jivesoftware.smack.packet.IQ; 
import org.jivesoftware.smack.provider.IQProvider; 
import org.jivesoftware.smack.util.StringUtils; 
import org.xmlpull.v1.XmlPullParser; 

/** 
 * @author John Wilson 
 * 
 */ 


public class JabberRPCProvider implements IQProvider { 


        public IQ parseIQ(final XmlPullParser parser) throws Exception { 
                final StringBuffer buffer = new StringBuffer(); 


                // skip the <query> tag by calling parser.next() 
                while (true) { 
                        switch (parser.next()) { 
                        case XmlPullParser.TEXT: 
                                // We need to escape characters like & and < 
                                buffer.append(StringUtils.escapeForXML(parser.getText())); 
                                break; 


                        case XmlPullParser.START_TAG: 
                                buffer.append('<' + parser.getName() + '>'); 
                                break; 


                        case XmlPullParser.END_TAG: 
                                if ("query".equals(parser.getName())) { 
                                        // don't save the </query> end tag 
                                        return new JabberRPC(buffer.toString().trim()); 
                                } else { 
                                        buffer.append("</" + parser.getName() + '>'); 
                                        break; 
                                } 
                        default: 
                        } 
                } 
        } 


} 


3.在smack中注册IQProvider . 
java代码为: 
org.jivesoftware.smack.provider.ProviderManager.addIQProvider("query", 
"jabber:iq:rpc", new JabberRPCProvider()); 

4.smack客户端例子: 


try { 
                        XMPPConnection con = new XMPPConnection("127.0.0.1", 5222); 
                        con.login("username", "password"); 
                        //注册IQProvider 
                        org.jivesoftware.smack.provider.ProviderManager.addIQProvider( 
                                        "query", "jabber:iq:rpc", new JabberRPCProvider()); 
                                        // 监听所有的包 
                        con.addPacketListener(new PacketListener() { 
                                public void processPacket(Packet packet) { 
                                        if (packet instanceof org.jivesoftware.smack.packet.IQ) { 
                                                org.jivesoftware.smack.packet.IQ iq = 
(org.jivesoftware.smack.packet.IQ) packet; 
                                                System.out.println("rpc内容为 " + iq.getChildElementXML()); 
                                        } 
                                } 


                        }, new org.jivesoftware.smack.filter.PacketFilter() { 
                                public boolean accept(Packet arg0) { 
                                        return true; 
                                } 


                        }); 
                        con.createChat("xmlrpc.lizongbo.im").sendMessage("测试发送!"); 
                        JabberRPC jp = new JabberRPC("xmlrpc"); 
                        jp.setType(org.jivesoftware.smack.packet.IQ.Type.SET); 
                        jp.setTo("xmlrpc.lizongbo.im"); 
                        con.sendPacket(jp); 
                        Thread.sleep(25000); 
                        con.close(); 
                } catch (Exception e) { 
                        e.printStackTrace(); 
                } 


5.服务端回应一个xmlrpc包: 
wildfire中通过插件进行响应: 
public void processPacket(Packet p) { 
                if (p instanceof IQ) { 
                        IQ iq =(IQ)p; 
                        IQ niq=IQ.createResultIQ(iq); 
                          Element responseElement=niq.setChildElement("query", 
"jabber:iq:rpc"); 
                        try { 
                                java.util.Vector v=new  java.util.Vector(); 
                                v.add("lizongbo  xmpp"); 
                                v.add("jabber-rpc lizongbo"); 
                                v.add("xep-0009 lizongbo"); 
                                XmlRpcResponseProcessor xrrp=new XmlRpcResponseProcessor(); 
                                String rs= new String( xrrp.encodeResponse(v, "UTF-8")); 
                                org.dom4j.Document re=org.dom4j.DocumentHelper.parseText(rs); 
                                responseElement.add(re.getRootElement()); 
                                componentManager.sendPacket(this, niq); 
                        } catch (Exception e) { 
                                e.printStackTrace(); 
                        } 
                } 
        } 


6.客户端输出结果为: 


rpc内容为 <query xmlns='jabber:iq:rpc'> 
<methodResponse><params><param><value><array><data><value>lizongbo 
xmpp</value><value>jabber-rpc lizongbo</value><value>xep-0009 
lizongbo</value></data></array></value></param></params></methodResponse> 
</query>


摘在博客:http://www.blogjava.net/lizongbo/archive/2006/12/04/85433.html

分享到:
评论

相关推荐

    smack-resolver-javax-4.1.0-alpha6.zip

    标题中的"smack-resolver-javax-4.1.0-alpha6.zip"是一个软件库的压缩包,Smack是一款开源的XMPP客户端库,而"javax"可能指的是它提供了与Java平台兼容的解析器组件。这个版本是4.1.0的Alpha6,意味着它是一个开发...

    smack-resolver-dnsjava-4.0.0-rc2.zip

    【标题】"smack-resolver-dnsjava-4.0.0-rc2.zip" 提供的是 Smack 开源库的一个版本,其中包含了 DNSJava 的解析器模块。Smack 是一个用于 XMPP(Extensible Messaging and Presence Protocol)的 Java 库,它允许...

    smack4.1.6连接openfire,tigase,ejabberd所需jar包

    jxmpp-core-0.5.0-alpha7 jxmpp-util-cache-0.5.0-alpha7 smack-android-4.1.6 smack-core-4.1.6 smack-extensions-4.1.6 smack-im-4.1.6 smack-sasl-provided-4.1.6 smack-tcp-4.1.6

    smack-resolver-minidns-4.1.0-alpha3.jar

    smack4.1.0的依赖包minidns.jar。可用于smack4.1.3,亲测可用!

    Android使用smack连接ejabberd服务器注册、收发消息

    在Android平台上,开发即时通讯应用时,我们常常会利用XMPP(Extensible Messaging and Presence Protocol)协议来实现。本文将详细讲解如何使用Smack库连接到ejabberd服务器,并进行用户注册、登录以及收发消息的...

    smack-core-4.0.0.zip

    本压缩包"smack-core-4.0.0.zip"包含了Smack Core 4.0.0版本的源代码,这是一个著名的Java即时通讯(Instant Messaging)库,主要用于实现XMPP协议。Smack为开发者提供了丰富的API,使得构建XMPP应用变得更加便捷。 ...

    [Cloudframeworks]SMACK Big Data Architecture - user guide .zip

    用户可以通过"**user-guide-smack-master**"这个文件进一步了解如何集成和使用这些组件,构建自己的SMACK大数据系统。 在实践中,SMACK架构被许多大型企业和组织采用,以应对快速增长的数据处理需求。理解并掌握...

    smack4.1.5 实现xmpp 所需要的所有jar

    7. smack-bosh-4.1.5.jar:支持HTTP绑定(BOSH)协议,这是一种让XMPP客户端通过HTTP长轮询与服务器保持连接的方式,适用于那些无法直接使用TCP连接的环境,如在网页浏览器中。 8. jxmpp-core-0.4.1.jar:JXMPP是一...

    smack-im-4.3.4-sources_www.im.43_im_

    【标题】"smack-im-4.3.4-sources_www.im.43_im_" 指的是 Smack IM 的4.3.4版本的源代码,这个开源项目主要关注即时通讯(IM)功能的实现。Smack是一个用Java编写的库,允许开发者在他们的应用程序中集成XMPP...

    smack-extensions-4.1.0-alpha3.zip

    【标题】"smack-extensions-4.1.0-alpha3.zip" 提供的是 Smack 开源库的一个扩展包,版本为4.1.0的Alpha3版本。Smack 是一个用于XMPP(Extensible Messaging and Presence Protocol)的Java库,它允许开发者在Java...

    smack4.1.6 java平台需要的jar包

    Smack是一个开源的XMPP客户端库,用于在Java应用中实现即时通讯(Instant Messaging and Presence Protocol)。它支持多种Java平台,包括Android,但这里特别强调了它是针对Java平台而非Android。 描述中提到"网上...

    smack-1.0-master

    这个"smack-1.0-master"压缩包包含的是Smack工具的源代码,主要版本为1.0,并且经过了特定的修改,能够支持`.smackcipso`、`smackload`、`smackaccess`和`smackctl`等工具的使用。下面将详细介绍这些工具和Smack系统...

    smack4.1所缺少的jar包

    smack4.1框架所依赖的jar包,引用smack4.1框架,除smack4.1本身的包外,还需要所依赖的五个jar包。 包括xmlpull-xpp3-3.0.0.20130526、commons-logging-1.1.1等五个jar包

    smack 4.1.6 实现xmpp所需要的所有jar jxmpp

    4. smack-core-4.1.6.jar:Smack的核心库,包含了实现基本XMPP功能的类和接口。 5. smack-core-4.1.6-sources.jar:核心库的源代码,供开发者参考和学习。 6. xpp3_xpath-1.1.4.jar:XPP3库的一个版本,用于处理...

    smack4.3.1

    在Smack 4.3.1版本中,开发者能够利用这个强大的框架为Android移动端构建高效、安全的聊天应用程序。它与Openfire等服务器软件配合使用,为用户提供实时的通信服务,包括一对一聊天、群组聊天、文件传输、在线状态...

    Smack-3.4.1.tar.gz

    在Smack-3.4.1中,我们可以期待以下关键知识点: 1. **连接管理**:Smack 提供了连接到XMPP服务器的接口,支持TCP、TLS/SSL以及WebSocket等多种连接方式。开发者可以方便地创建并管理连接,确保数据安全传输。 2. ...

    最全xmpp开发smack 4.2.2所需jar包

    smack-im-4.2.2.jar smack-tcp-4.2.2.jar smack-extensions-4.2.2.jar smack-core-4.2.2.jar smack-android-extensions-4.2.2.jar jxmpp-jid-0.6.0.jar jxmpp-core-0.6.0.jar jxmpp-util-cache-0.6.0.jar等jar包

Global site tag (gtag.js) - Google Analytics