XML-RPC简单使用

RPC(Remote Procedure Call)即远程方法调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术。这个过程也被大家称为“分布式计算”,是为了提高各个分立机器的“互操作性”而发明出来的技术。
XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用。
它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。
这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式。
Xml-Rpc的定义尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。
Python下的XML-RPC:
1、类库:xmlrpclib 一般使用在客户端,这个模块用来调用注册在XML-RPC服务器端的函数,xmlrpclib并不是一个类型安全的模块,无法抵御恶意构造的数据,这方面的一些处理工作需要交给开发者自己。
2、类库:SimpleXMLRPCServer 一般是用在服务器端,这个模块用来构造一个最基本的XML-RPC服务器框架

代码:

xml_rpc_server.py

# coding=utf-8
import os
import SimpleXMLRPCServer

# 获取当前路径
def pwd():
    return os.getcwd()

# 列出指定目录中的内容
def ls(directory=None):
    if directory is None:
        directory = pwd()
    try:
        return os.listdir(directory)
    except OSError as e:
        return e

# 改变工作路径
def cd(directory):
    try:
        os.chdir(directory)
    except OSError as e:
        return e
    return 'change current working direcotry to: %s' % (directory)

# 创建目录
def mkdir(directory):
    try:
        os.mkdir(directory)
    except OSError as e:
        return e
    else:
        return 'successfully create directory: %s' % directory

# 文件拷贝
def cp(src, dest):
    with open(src, 'r') as fin:
        with open(dest, 'w') as fout:
            fout.write(fin.read())
    return 'copy %s->%s' % (src, dest)


class Person(object):
    def __init__(self, name, age):
        self._name = name
        self._age = age

    def show(self):
        return str(self)

    def __str__(self):
        return 'Person(name=%s,age=%s' % (self._name, self._age)


if __name__ == "__main__":
    s = SimpleXMLRPCServer.SimpleXMLRPCServer(('0.0.0.1', 8000))
    s.register_function(pwd)  # 注册函数
    s.register_function(ls)
    s.register_function(cd)
    s.register_function(mkdir)
    s.register_function(cp)
    p = Person('python', 28)
    s.register_instance(p)  # 注册对象实例
    s.serve_forever()

 

启动xml_rpc服务器: 

python xml_rpc_server.py

测试:

>>> import xmlrpclib
>>> x = xmlrpclib.ServerProxy('http://192.168.87.200:8000')
>>> x.pwd()  #获取服务器所在路径
'/home/hupeng/WorkSpace/Python/xml_rpc'
>>> x.ls()
['1.txt', 'xml_rpc_server.py']
>>> x.cp('1.txt','2.txt')
'copy 1.txt->2.txt'
>>> x.mkdir('tmp')
'successfully create directory: tmp'
>>> x.show() #调用对象的show方法
'Person(name=python,age=28)'

注意:

注册的函数要有返回值,否则可能会出现如下错误:

Fault: <Fault 1: "<type 'exceptions.TypeError'>:cannot marshal None unless allow_none is enabled">

 

转载于:https://www.cnblogs.com/hupeng1234/p/6716263.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Java XML-RPC 服务器和客户端示例: 服务器: ```java import java.io.IOException; import java.net.InetSocketAddress; import com.sun.net.httpserver.HttpServer; import org.apache.xmlrpc.webserver.WebServer; import org.apache.xmlrpc.server.XmlRpcServer; import org.apache.xmlrpc.server.PropertyHandlerMapping; public class XmlRpcServerTest { public static void main(String[] args) throws IOException { HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0); WebServer webServer = new WebServer(server); XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer(); PropertyHandlerMapping phm = new PropertyHandlerMapping(); phm.addHandler("MyHandler", MyHandler.class); xmlRpcServer.setHandlerMapping(phm); server.start(); } } class MyHandler { public int add(int x, int y) { return x + y; } } ``` 客户端: ```java import org.apache.xmlrpc.client.XmlRpcClient; import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; import java.net.URL; public class XmlRpcClientTest { public static void main(String[] args) throws Exception { XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); config.setServerURL(new URL("http://localhost:8080")); XmlRpcClient client = new XmlRpcClient(); client.setConfig(config); Object[] params = new Object[]{2, 3}; int result = (int) client.execute("MyHandler.add", params); System.out.println("Result: " + result); } } ``` 这个示例中,服务端创建了一个 XML-RPC 服务器并注册了一个 `MyHandler` 处理器,客户端通过调用 `MyHandler.add` 方法来求和。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值