XML-RPC初探
来源:互联网 发布:淘宝如何延长付款 编辑:程序博客网 时间:2024/05/20 20:17
今天在TSS上发现了XML-RPC的帖子,就粗略的看了些资料,感觉这种轻量级的跨平台远程调用很有意思啊。用起来简单,据说速度也很快(自己没有试过)。
下面贴一些资料:
XML-RPC 是工作在 Internet 上的远程过程调用协议。通俗点讲,就是使用 HTTP 协议交互,交互的载体是 XML 文件。XML-RPC 具体的规范说 明请参考这里。
图片来自XML-RPC官方网站
XML-RPC 规范定义了六种数据类型,下表是这六种数据类型与 Java 的数据类型对应表。
XML-RPCJava<i4> 或 <int>int<boolean>boolean<string>java.lang.String<double>double<dateTime.iso8601>java.util.Date<struct>java.util.Hashtable<array>java.util.Vector<base64>byte[ ]XML-RPC 规范的各种平台都有具体实现,XML-RPC 规范的 Java 实现都有好几种,这里我们选择了 Apache XML-RPC。
XML-RPC 服务端实现
先定义一个简单业务对象 MyHandler,远程客户端将调用该对象的方法,具体代码如下:
package net.sentom.xmlrpc;public class MyHandler {public String sayHello(String str){return "Hello," + str;}}
然后定义一个 Servlet 名叫 MyXmlRpcServer,远程客户端通过 HTTP-POST 访问该 Servlet。
package net.sentom.xmlrpc;import java.io.IOException;import java.io.OutputStream;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.xmlrpc.XmlRpcServer;public class MyXmlRpcServer extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {XmlRpcServer xmlrpc = new XmlRpcServer();xmlrpc.addHandler("myHandler", new MyHandler());byte[] result = xmlrpc.execute(request.getInputStream());response.setContentType("text/xml");response.setContentLength(result.length);OutputStream out = response.getOutputStream();out.write(result);out.flush();}}
需要特别说明是:
xmlrpc.addHandler("myHandler", new MyHandler());
为了便于理解,这里可以看成普通的:
MyHandler myHandler = new MyHandler();
最后在web.xml文件中加入以下几行:
<servlet> <servlet-name>MyXmlRpcServer</servlet-name> <servlet-class>net.sentom.xmlrpc.MyXmlRpcServer</servlet-class></servlet><servlet-mapping> <servlet-name>MyXmlRpcServer</servlet-name> <url-pattern>/MyXmlRpcServer</url-pattern></servlet-mapping>
XML-RPC 客户端实现
客户端相对简单一些,先来一个 Java 客户端实现 MyXmlRpcClient:
package net.sentom.xmlrpc;import java.io.IOException;import java.net.MalformedURLException;import java.util.Vector;import org.apache.xmlrpc.XmlRpcClient;import org.apache.xmlrpc.XmlRpcException;public class MyXmlRpcClient {public static void main(String[] args) {try {XmlRpcClient xmlrpc = new XmlRpcClient("http://localhost:8080/XMLRPC/MyXmlRpcServer");Vector params = new Vector();params.addElement("Tom");String result = (String) xmlrpc.execute("myHandler.sayHello",params);System.out.println(result);} catch (MalformedURLException e) {System.out.println(e.toString());} catch (XmlRpcException e) {System.out.println(e.toString());} catch (IOException e) {e.printStackTrace();}}
http://localhost:8080/XMLRPC/MyXmlRpcServer 为 MyXmlRpcServer 的访问URL。
String result = (String) xmlrpc.execute("myHandler.sayHello",params);
再来一个 Python 客户端实现
import xmlrpcliburl = 'http://localhost:8080/XMLRPC/MyXmlRpcServer';server = xmlrpclib.Server(url);print server.myHandler.sayHello('Tom');来源:http://www.sentom.net
[原创]xml-rpc入门例程及一个通用服务器
一,准备过程远程过程调用RPC,基于XML的传输方式,当然低层API,就不用我们操心了,但必须的软件还是要有的,先给个列表清单
JDK1.4.2 不用说了
Xerces解析器 到http://xml.apache.org/上去下载吧,
XML-RPC开发包, http://ws.apache.org/xmlrpc/上可以下得到将以上所有的jar包放到开发环境的classpath中。
二,Hello World
XML-RPC如果想跑起来,最后需要四个组件,WEB server, 服务器类,处理类,客户类
1.WEB Server.
在我们已经下载的XML-RPC包中就有一个轻型级的WEB SERVER。
在程序中,我们只需要简单的用以下语句就可以启动。
//建立一个对象,传输一个端口
WebServer server = new WebServer(Integer.parseInt("8989"));
//启动
server.start();2.编写处理类
处理类相当RMI中的远程类,只不过在这里更轻量类,无须任何接口.
在这个类中包含一个或多个公有方法以供远程的客户端来调用。
public class HelloHandler {
public String sayHello(String name) {
return "Hello " + name;
}
}
3.服务器负责调用以上代码来启动用服务器,同时还要将远程对象绑定到该服务器上。
import java.io.IOException;
//引入必须的包,当然你的xml-rpc的包应该在classpath中
import org.apache.xmlrpc.WebServer;
import org.apache.xmlrpc.XmlRpc;
public class HelloServer {
/**
主方法
*/
public static void main(String[] args) {
try {
// 使用Xerces的XML解析器
XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser");
// 给出提示,并在端8989上启动服务器
System.out.println("Starting XML-RPC Server...");
WebServer server = new WebServer(Integer.parseInt("8989"));
server.start();
// 将HelloHandler类的实例编定到WEB SERVER上,hello是该处理类的标识,在客户端调用时要用得到
server.addHandler("hello", new HelloHandler());
System.out.println(
"Registered HelloHandler class to /"hello/"");
} catch (ClassNotFoundException e) {
System.out.println("Could not locate SAX Driver");
} catch (Exception e) {
System.out.println("Could not start server: " +
e.getMessage());
}
}
}4.客户端
根据“标识名.方法名“来定位远程的处理方法。import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Vector;//导入必须的包
import org.apache.xmlrpc.XmlRpc;
import org.apache.xmlrpc.XmlRpcClient;
import org.apache.xmlrpc.XmlRpcException;
public class HelloClient {public static void main(String args[]) {
String yourname="liu xiaobai";
try {
// 使用 Apache Xerces SAX 解析器
XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser");
// 定位远程服务器,http://主机地址:端口号, 8989是上文服务器启动时用的端口
XmlRpcClient client =
new XmlRpcClient("http://localhost:8989/");
// 创建调用请求,方法的参数列表如果一个Vector对象来存储。
Vector params = new Vector();
params.addElement(yourname);
// 发出请求,并返回结果,execute需要两个参数,第一个参数用“标识名.方法名”,第二参数是一个 刚刚建立的向量对象
String result =
(String)client.execute("hello.sayHello", params);
System.out.println("Response from server: " + result);
} catch (ClassNotFoundException e) {
System.out.println("Could not locate SAX Driver");
} catch (MalformedURLException e) {
System.out.println(
"Incorrect URL for XML-RPC server format: " +
e.getMessage());
} catch (XmlRpcException e) {
System.out.println("XML-RPC Exception: " + e.getMessage());
} catch (IOException e) {
System.out.println("IO Exception: " + e.getMessage());
}
}
}5,编译以上代码,要确保解析器,XMP-RPC开发包的jar文件在classpath中。
运行服务器
java HelloServer
运行客户端
java HelloClient
6.一个通用的XML服务器
功能描述:通过配置文件来配置要加载的处理器
1.配置文件的名称及位置
名字:config.properties
类文件的根目录中,如果你类是默认包,那么就是同一个目录;如果类的包名是com.hello,那么该文件应该与com目录放在同一级中。
内容:
#标识名=类名
hello=javaxml2.HelloHandler
2.通用的源代码import java.io.*;
import org.apache.xmlrpc.*;
import java.util.Properties;
import java.util.Enumeration;
import java.util.Hashtable;
public class MyLightXMLServer
{
private WebServer server;
private int port;
private String configfile;
public MyLightXMLServer(int port,String config)
{
this.port=port;
this.configfile=config;
}
//启动服务器
public void start() throws IOException,ClassNotFoundException,Exception
{
XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser");
System.out.println("starting up xml-rpc server...");
server=new WebServer(port);
//调用注册函数
registerHandlers(this.getHandlers());
server.start();
}
public void registerHandlers(Properties handlers) throws Exception
{
Enumeration enum=handlers.propertyNames();
while(enum.hasMoreElements())
{
String temp=(String)enum.nextElement();
String tempcls=(String)handlers.get(temp);
Class cls=Class.forName(tempcls);
server.addHandler(temp,cls.newInstance());
}
}
public Properties getHandlers()
{
try
{
Properties properties=new Properties();
properties.load(new FileInputStream(new File("config.properties")));
return properties;
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
}
public static void main(String args[])
{
String port="8989";
String configfile="";
MyLightXMLServer server=new MyLightXMLServer(Integer.parseInt(port),configfile);
try
{
server.start();
}
catch(Exception e)
{e.printStackTrace();}
}
}将MyLightXMLServer .java编译并运行之后,该服务器会在配置文件中加载该处理器
然后可以直接执行HelloClientjava HelloClient
- XML-RPC初探
- XML-RPC
- xml-rpc
- XML-RPC
- XML-RPC
- xml-rpc
- XML-RPC
- JSON-RPC,XML-RPC,SOAP
- Python RPC 之 xml-rpc
- hadoop通信核心:初探RPC
- RabbitMQ 之 RPC 初探(Java)
- xml初探
- 初探XML
- XML-RPC 之 Apache XML-RPC 实例
- XML-RPC入门
- XML-RPC & SOAP
- XML-RPC Specification
- Apache XML-RPC入门
- VC++孙鑫视频笔记(十一)
- Oracle通用日志表设计
- 日期格式 SimpleDateFormat
- IE開啓緩慢
- js正则表达式使用
- XML-RPC初探
- text-indent在火狐下失效的研究
- Spring事务配置的五种方式
- 将图片保存到数据库并用GridView显示
- 内存分配方式
- 数据库连接池技术
- String、StringBuilder和StringBuffer的区别
- linux 内核调试
- php session操作