一、介绍
相较于Java RMI机制,XML-RPC机制出现了以下的变化(具体参看Java RMI 实现):
- 通信是基于XML数据,而不是RMI专用协议,使用跨平台调用成为可能。
-
基于Http协议,而不是长连接方式。
XML RPC 原理图
二、基于org.apache.xmlrpc
的案例实现:
- 库引入
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'
}
- 服务类:
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;
}
}
- 类路径下的
MyHandlers.properties
Calculator=service.Calculator
- 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();
}
}
- 客户端:
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();
}
}
}
*我们可以看到,客户端除了“类名,方法名”以外,没有与服务端有任何藕合!!!
网友评论