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包
二:方法类(只要服务端有就行,但是如果要使用动态代理技术,则要在客户端添加接口类)
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 methodstubXmlRpcHttpRequestConfig config= (XmlRpcHttpRequestConfig) xrr.getConfig();returnisAuthenticated(config.getBasicUserName(),config.getBasicPassword());
}private booleanisAuthenticated(String basicUserName, String basicPassword){
// TODO Auto-generated methodstubif(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"));//设置服务端urlconfig.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
- RPC/RMI之二:XMLRPC
- RPC/RMI之三:JSONRPC
- RPC-RMI
- Java RPC通信机制之RMI
- Java RPC通信机制之RMI
- Java RPC通信机制之RMI
- Java RPC通信机制之RMI
- Java RPC通信机制之RMI
- Java RPC通信机制之RMI
- RPC入门总结(二)RMI的原理和使用
- RPC/RMI之一:RPC简介
- Java RMI之HelloWorld 与 Java简单实现RPC
- rpc 协议规范 之 rmi http webservice 和 一些框架
- RPC and RMI
- RMI与RPC
- RMI, RPC, CORBA区别
- RPC、RMI、JMS、WebService
- socket,RPC,RMI.EJB
- 网络编程之二:java.net包的Socket和SocketServer
- 网络编程之三:java.net包的DatagramSocket和DatagramPacket
- 单例传值
- 分布式系统之一:分布式系统的挑战
- RPC/RMI之一:RPC简介
- RPC/RMI之二:XMLRPC
- RPC/RMI之三:JSONRPC
- 分布式系统之二:CAP定理
- 分布式系统之三:CAP定理的实践
- Java之一:Serialization(序列化…
- Java之二:工厂模式
- Java之三:Java类的装载、链接和初始化
- Java之四:类的加载器ClassLoader
- Java之五:Java实例化类的方法