RPC/RMI之二:XMLRPC

来源:互联网 发布:图片二维码识别软件 编辑:程序博客网 时间:2024/03/28 16:57
本博文主要介绍XML以及XMLRPC的使用

RPC的原理和设计框架
    请看 《RPC/RMI之一:RPC简介》
XML
    名为可扩展标记语言,它是外部数据表示的一种(外部数据表示会在其他章节讲诉),它与josn一样是一种数据交换格式。详细可见XML百科,在其他章节会讲述如何解析XML,这里讲诉它的特征:
    1. XML是HTML的补充,目的是为了存储和传输数据,而HTML是为了展示数据
    2. 标签没有被预定义,而且具有自我描述性,因此常作为外部表示数据
    3. W3C的推荐标准
XMLRPC
    基于XML 的远程过程调用,一个XML-RPC 请求消息就是一个 HTTP-POST 请求消息,其请求消息主体基于 XML格式。主流的开发语言都提供了XML-RPC 协议的客户端程序和服务端程序的实现,这些语言包括 Java、Ruby、Python、C/C++ 、Perl 和 PHP等。
    我使用的java语言的Apache XML-RPC,下面直接给出相应程序:
    一:jar包
RPC/RMI之二:XMLRPC
    
    二:方法类(只要服务端有就行,但是如果要使用动态代理技术,则要在客户端添加接口类)
      publicinterface  Calculator {
public intadd(int i, int j);
public intsubtract(int i, int j);
}

public classCalculatorImpl implements Calculator{
public int add(int i, int j){
return i +j;
}

public intsubtract(int i, int j) {
return i -j;
}
}
三:服务端
importjava.io.IOException;
importorg.apache.xmlrpc.XmlRpcException;
importorg.apache.xmlrpc.metadata.XmlRpcSystemImpl;
importorg.apache.xmlrpc.server.AbstractReflectiveHandlerMapping.AuthenticationHandler;
importorg.apache.xmlrpc.server.PropertyHandlerMapping;
importorg.apache.xmlrpc.server.XmlRpcServer;
importorg.apache.xmlrpc.server.XmlRpcServerConfigImpl;
importorg.apache.xmlrpc.webserver.WebServer;
public classXMLServer {
private static finalint port = 4444;
public static voidmain(String[] args) throws XmlRpcException,IOException{
WebServer webServer =new WebServer(port);//建立一个SocketServer并绑定到4444端口,并启动存根过程作编码解码工作
XmlRpcServerxmlRpcServer = webServer.getXmlRpcServer();//建立服务过程
PropertyHandlerMapping phm = newPropertyHandlerMapping();
phm.addHandler("ac.cn.iie.evan.xmlrpc.Calculator",ac.cn.iie.evan.xmlrpc.CalculatorImpl.class); //计算服务
AuthenticationHandlerhandler = new MyAuthenticationHandler(); //用户验证服务
phm.setAuthenticationHandler(handler);
xmlRpcServer.setHandlerMapping(phm);
XmlRpcSystemImpl.addSystemHandler(phm); 
XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl)xmlRpcServer.getConfig(); //修改配置
serverConfig.setEnabledForExtensions(true);
serverConfig.setEnabledForExceptions(true);
serverConfig.setContentLengthOptional(false);
webServer.start();//启动服务
}
}
四:验证服务
importorg.apache.xmlrpc.XmlRpcException;
importorg.apache.xmlrpc.XmlRpcRequest;
importorg.apache.xmlrpc.common.XmlRpcHttpRequestConfig;
importorg.apache.xmlrpc.server.AbstractReflectiveHandlerMapping.AuthenticationHandler;
public class MyAuthenticationHandlerimplements AuthenticationHandler {
public booleanisAuthorized(XmlRpcRequest xrr) throws XmlRpcException{
// TODO Auto-generated methodstub
XmlRpcHttpRequestConfig config= (XmlRpcHttpRequestConfig) xrr
.getConfig();
returnisAuthenticated(config.getBasicUserName(),
config.getBasicPassword());
}

private booleanisAuthenticated(String basicUserName, String basicPassword){
// TODO Auto-generated methodstub
if(basicUserName.equals("evan") &&basicPassword.equals("111111")) {
returntrue;
} else {
returnfalse;
}
}
}
五:客户端
importjava.net.MalformedURLException;
import java.net.URL;
importorg.apache.xmlrpc.XmlRpcException;
importorg.apache.xmlrpc.client.XmlRpcClient;
importorg.apache.xmlrpc.client.XmlRpcClientConfigImpl;
importorg.apache.xmlrpc.client.util.ClientFactory;
public class XMLClient {
public static voidmain(String[] args) throwsMalformedURLException,XmlRpcException{
XmlRpcClientConfigImpl config= new XmlRpcClientConfigImpl();
config.setServerURL(newURL("http://localhost:4444"));//设置服务端url
config.setEnabledForExceptions(true);
config.setConnectionTimeout(5* 1000); //设置连接超时
config.setReplyTimeout(10 *1000); //设置响应超时
config.setBasicUserName("evan");//设置用户信息
config.setBasicPassword("111111");//设置用户信息
XmlRpcClient client = newXmlRpcClient(); //注册对象和存根过程
client.setConfig(config);//注册通信模块
Object[] params = new Object[]{ new Integer(2), new Integer(3) };
Integer result1 = (Integer)client.execute(
"ac.cn.iie.evan.xmlrpc.Calculator.subtract",params);//调用服务端subtract过程
Integer result2 = (Integer)client.execute(
"ac.cn.iie.evan.xmlrpc.Calculator.add", params);//调用服务端add过程

//动态代理技术调用服务端过程。
ClientFactory factory = newClientFactory(client);
Calculator c = (Calculator)factory.newInstance(Calculator.class);
Integer result3 = c.add(2,3);
Integer result4 =c.subtract(2, 3);

System.out.println("resulet1 :" + result1);
System.out.println("resulet2 :" + result2);
System.out.println("resulet3 :" + result3);
System.out.println("resulet4 :" + result4);

//查看服务端提供的方法
Object[] params2 = newObject[0];
try{
Object[] resultArray =(Object[]) client.execute("system.listMethods",params2);
for (int i = 0; i <resultArray.length; i++) {
System.err.println(i + "#.  " + resultArray[i]);
}
} catch (XmlRpcException e){
e.printStackTrace();
}
}
}

由于博主知识有限,如有误,请指正点评,欢迎交流
0 0
原创粉丝点击