基于Java的XML-RPC案例

2021-01-29  本文已影响0人  JohnYuCN

一、介绍

相较于Java RMI机制,XML-RPC机制出现了以下的变化(具体参看Java RMI 实现):

  1. 通信是基于XML数据,而不是RMI专用协议,使用跨平台调用成为可能。
  2. 基于Http协议,而不是长连接方式。


    XML RPC 原理图

二、基于org.apache.xmlrpc 的案例实现:

  1. 库引入
dependencies {
    compile group: 'org.apache.xmlrpc', name: 'xmlrpc-server', version: '3.1.3'
    compile group: 'org.apache.xmlrpc', name: 'xmlrpc-client', version: '3.1.3'
}
  1. 服务类:
package service;
 
public class Calculator {
 
    public int add(int i1, int i2) {
        return i1 + i2;
    }
 
    public int subtract(int i1, int i2) {
        return i1 - i2;
    }
}
  1. 类路径下的 MyHandlers.properties
Calculator=service.Calculator
  1. RPC Server
package webserver;
 
import org.apache.xmlrpc.server.PropertyHandlerMapping;
import org.apache.xmlrpc.server.XmlRpcServer;
import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;
import org.apache.xmlrpc.webserver.WebServer;
 
public class Server {
    private static final int port = 8080;   
    
    public static void main(String[] args) throws Exception {   
        WebServer webServer = new WebServer(port);   
         
        XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();   
         
        PropertyHandlerMapping phm = new PropertyHandlerMapping();
        
        phm.load(Thread.currentThread().getContextClassLoader(), "MyHandlers.properties");
        //这也是一种指定方案
        //phm.addHandler("Calculator", service.Calculator.class);

        xmlRpcServer.setHandlerMapping(phm);   
         
        XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();   
        serverConfig.setEnabledForExtensions(true);   
        serverConfig.setContentLengthOptional(false);   
 
        webServer.start();   
    }   
 
}
  1. 客户端:
package xmlrpc.client;
 
import java.net.MalformedURLException;
import java.net.URL;
 
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
 
public class ClientTest {
 
    public static void main(String[] args) {
        try {
            XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
            config.setServerURL(new URL("http://127.0.0.1:8080/XML_RPC_Server/service"));
            
            XmlRpcClient client = new XmlRpcClient();
            client.setConfig(config);
            
            Object[] params = new Object[] { 32, 9 };
            Integer result = (Integer) client.execute("Calculator.add", params);
            
            System.out.printf("两数相加的结果是:%d\n",result);
            
            result = (Integer) client.execute("Calculator.subtract", params);

            System.out.printf("两数相减的结果是:%d",result);
 
        } catch (XmlRpcException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
 
    }
}

*我们可以看到,客户端除了“类名,方法名”以外,没有与服务端有任何藕合!!!

上一篇 下一篇

猜你喜欢

热点阅读