XML-RPC是一个远程过程调用远端程序呼叫)(remote procedure call,RPC)的分布式计算协议,通过XML将调用函数封装,并使用HTTP协议作为传送机制。
 
中文名
XML-RPC
外文名
XML Remote Procedure Call
属    于
标准通用标记语言
类    型
一个子集

关于XML-RPC

基本介绍

XML-RPC是工作在Internet上的远程过程调用协议。一个XML-RPC消息就是一个请求体为xml的http-post请求,被调用的方法在服务器端执行并将执行结果以xml格式编码后返回。

Request example

Here's an example of an XML-RPC request:
POST /RPC2 HTTP/1.0User-Agent: Frontier/5.1.2 (WinNT)Host: betty.userland.comContent-Type: text/xmlContent-length: 181
1
2
3
4
5
6
7
8
9
10
11
<?xmlversion="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value>
<i4>41</i4>
</value>
</param>
</params>
</methodCall>

Response example

Here's an example of a response to an XML-RPC request:
HTTP/1.1 200 OKConnection: closeContent-Length: 158Content-Type: text/xmlDate: Fri, 17 Jul 1998 19:55:08 GMTServer: UserLand Frontier/5.1.2-WinNT
1
2
3
4
5
6
7
8
9
10
11
12
<?xmlversion="1.0"?>
<methodResponse>
<params>
<param>
<value>
<string>
SouthDakota
</string>
</value>
</param>
</params>
</methodResponse>

XML-RPC入门程序

基本做法

以下的入门程序包括一个管理器(HelloHandler)、一个服务器(HelloServer)、一个客户程序(HelloClient)。
首先要做的是创建用于远程过程调用的类和方法,人们常常称之为管理器。Xml-rpc管理器是一个方法和方法集,它接受xml-rpc请求,并对请求的内容进行解码,再向一个类和方法发出请求。
 

管理器类

 
1
2
3
4
5
6
7
packagexmlRpc;
/***@authortrier**<b><code>HelloHandler</code></b>isasimplehandlerthancan*beregisteredwithanXML-RPCserver*/
publicclassHelloHandler{
publicStringsayHello(Stringname){
return"Hello"+name;
}
}
服务器程序将创建的管理器注册到服务器上,并为服务器指明应用程序其他特定的参数。
 

服务器类

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
packagexmlRpc;
/**
*
*<b><code>HelloServer</code></b>isasimpleXML-RPCserver
*thatwilltakethe<code>HelloHandler</code>classavailable
*forXML-PRCcalls.
*<o:p
*/
importorg.apache.xmlrpc.WebServer;
importorg.apache.xmlrpc.XmlRpc;
importjava.IOException;
publicclassHelloServer{
publicstaticvoidmain(String[]args){
if(args.length<1){
System.out.println("Usage:javaHelloServer[port]");
System.exit(-1);
}
try{
XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser");
//starttheserver
System.out.println("StartingXML-RPCServer......");
WebServerserver=newWebServer(Integer.parseInt(args[0]));
//registerourhandlerclass
server.addHandler("hello",newHelloHandler());
System.out.println("Nowacceptingrequests......");
}catch(ClassNotFoundExceptione){
System.out.println("CouldnotlocateSAXDriver");
}catch(IOExceptione){
System.out.println("Couldnotstartserver:"+e.getMessage());
}
}
}
 

客户程序

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
packagexmlRpc;
/**
*
*<b><code>HelloClient</code></b>isasimpleXML-RPCclient
*thatmakesanXML-RPCrequestto<code>HelloServer</code>
*/
importjava.i.IOException;
importjava.util.Vector;
importorg.apache.xmlrpc.XmlRpc;
importorg.apache.xmlrpc.XmlRpcClient;
importjava.t.MalformedURLException;
importorg.apache.xmlrpc.XmlRpcException;
publicclassHelloClient{
publicstaticvoidmain(String[]args){
if(args.length<1){
System.out.println("Usage:javaHelloClient[yourname]");
System.exit(-1);
}
try{
//UsetheApacheXerecesSAXDriver
XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser");
//Specifytheserver
XmlRpcClientclient=newXmlRpcClient("http://localhost:8585");
//createrequest
Vectorparams=newVector();
params.addElement(args[0]);
//makearequestandprinttheresult
Stringresult=(String)client.execute("hello.sayHello",params);
System.out.println("Responsefromserver:"+result);
}catch(ClassNotFoundExceptione){
System.out.println("CouldnotlocateSAXDriver");
}catch(MalformedURLExceptione){
System.out.println("IncorrectURLfroxml-rpcserverforamt:"+e.getMessage());
}catch(XmlRpcExceptione){
System.out.println("XmlRpcException:"+e.getMessage());
}catch(IOExceptione){
System.out.println("IOException:"+e.getMessage());
}
}
}
 

RPC和RMI的简单比较

调用形式

在RMI和RPC之间最主要的区别在于方法是如何被调用的。在RMI中,远程接口使每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口上,那么这个新方法就不能被RMI客户方所调用。
 

classname.methodname的形式

在RPC中,当一个请求到达RPC服务器时,这个请求就包含了一个参数集和一个文本值,通常形成“classname.methodname”的形式。
 

methodname

这就向RPC服务器表明,被请求的方法在为“classname”的类中,名叫“methodname”。然后RPC服务器就去搜索与之相匹配的类和方法,并把它作为那种方法参数类型的输入。这里的参数类型是与RPC请求中的类型是匹配的。
 

匹配成功后

一旦匹配成功,这个方法就被调用了,其结果被编码后返回客户方。 

XML-RPC-1概述的更多相关文章

  1. 什么是XML RPC?

    # -*- coding: cp936 -*- #python 27 #xiaodeng #什么是XML RPC? #中文叫:远程过程调用 #使用http协议做传输协议的rpc机制,使用xml文本的方 ...

  2. The type javax.xml.rpc.ServiceException cannot be resolved.It is indirectly

    The type javax.xml.rpc.ServiceException cannot be resolved.It is indirectly 博客分类: 解决方案_Java   问题描述:T ...

  3. 【PHP XML与dtd概述【完整版】】

    一.XML文件简介 关于XML的大多数人都知道一些,HTML->xhtml->xml,这个顺序本来应当是HTML发展的顺序. XML可以当做配置文件使用,还可以充当小型的数据库. vers ...

  4. 关于XML的DTD概述

    1 DTD概述 1.1 什么是DTD DTD(Document Type Definition),文档类型定义,用来约束XML文档.或者可以把DTD理解为创建XML文档的结构!例如可以用DTD要求XM ...

  5. xml rpc SimpleXMLRPCServer [python]

    SimpleXMLRPCServe 其实里面xml的概念不是很强,主要是rpc !不用关心什么xml . rpc 是就是远程调用,把函数什么的放到远程服务器上,本地调用就行了.用 SimpleXMLR ...

  6. [03] mapper.xml的基本元素概述

    1.select 我们基于这个持久层接口 GirlDao: public interface GirlDao { List<Girl> findByAge(int age); Girl f ...

  7. alluxio源码解析-rpc调用概述(1)

    alluxio中几种角色以及角色之间的rpc调用: 作为分布式架构的文件缓存系统,rpc调用必不可少 client作为客户端 master提供thrift rpc的服务,管理以下信息: block信息 ...

  8. xml的解析(概述)

    使用java解析xml☆☆☆ 四个类:分别是针对dom和sax解析使用的类   -dom :     DocumentBuilder:解析器类       -这个类是个抽象类,不能new,       ...

  9. Android之布局androidmanifest.xml 资源清单 概述

    转载:https://www.cnblogs.com/wytings/p/4083463.html AndroidManifest.xml配置文件对于Android应用开发来说是比较细但又很重要的基础 ...

  10. supervisord支持扩展(xml RPC API & Third Party Applications and Libraries)

    XML-RPC API Documentation http://www.supervisord.org/api.html Third Party Applications and Libraries ...

随机推荐

  1. Quartz调度系统入门和调度高可用实现方案

    ** 版本:2.2.1 ** Hello world: https://www.jianshu.com/p/810400e6a274

  2. 002-创建型-02-抽象工厂模式(Abstract Factory)

    一.概述 抽象工厂模式提供同一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一 ...

  3. python面试必备-基础篇

    一.python中and, or, and-or语法 1.and   有假先出假 在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的一样,但是它们并不返回布尔值:而是,返回它们实际进 ...

  4. python判断命令执行成功

    if os.system('lss') !=0: print 'Without the command'

  5. 汉化Git Gui

    先来一个图: 其实使用自带的图形化操作git还是很方便的,但是英文界面还是让相当一部分小伙伴不太舒服,比如我哈. 汉化包地址:链接: https://pan.baidu.com/s/1qQtBUsf1 ...

  6. 查看某个进程PID对应的文件句柄数量,查看某个进程当前使用的文件句柄数量

    ================================ 1.linux所有句柄查询 lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more ...

  7. CentOS 7 安装wordpress

    1.安装php 要安装php 7,必须使用下面的命令在Centos7系统上安装并启用epel和remi存储库. 输入一下代码, yum install http://rpms.remirepo.net ...

  8. socket网络编程 的基本方法:--ongoing

    https://blog.csdn.net/shuxiaogd/article/details/50366039在学习网络编程时,我们总是从最简单的Server程序写起:socket -> bi ...

  9. docker容器端口号、时区修改

     一.修改端口号 在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提 ...

  10. 关于npm install 报错 EAI_AGAIN reason: getaddrinfo EAI_AGAIN registry.npmjs.org

    在公司里使用了isa连接外网,刚开始使用npm 安装依赖的时候一直报错EAI_AGAIN reason: getaddrinfo EAI_AGAIN registry.npmjs.org,我们的老大给 ...