lizongbo 的 編程學習

          http://618119.com

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            23 Posts :: 1 Stories :: 78 Comments :: 0 Trackbacks
          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());
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 監(jiān)聽所有的包
          ? ? ? ? ? ? ? ? ? ? ? ? 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內(nèi)容為 " + iq.getChildElementXML());
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }

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

          ? ? ? ? ? ? ? ? ? ? ? ? });
          ? ? ? ? ? ? ? ? ? ? ? ? con.createChat("xmlrpc.lizongbo.im").sendMessage("測試發(fā)送!");
          ? ? ? ? ? ? ? ? ? ? ? ? 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.服務(wù)端回應(yīng)一個xmlrpc包:
          wildfire中通過插件進行響應(yīng):
          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.客戶端輸出結(jié)果為:

          rpc內(nèi)容為 <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>

          posted on 2006-12-04 18:16 lizongbo 的編程學習 閱讀(3860) 評論(0)  編輯  收藏 所屬分類: java開源
          主站蜘蛛池模板: 会同县| 桐乡市| 公安县| 兴仁县| 巴塘县| 霍城县| 东至县| 嵊州市| 温泉县| 区。| 油尖旺区| 岐山县| 高青县| 博客| 万源市| 余姚市| 普定县| 集安市| 筠连县| 石楼县| 革吉县| 苏州市| 潮安县| 正蓝旗| 高青县| 广灵县| 响水县| 绥宁县| 阜康市| 石景山区| 四子王旗| 岳阳市| 黄梅县| 镇坪县| 英超| 新源县| 荔波县| 万州区| 淮阳县| 万盛区| 大安市|