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>