XML-RPC -- python

xiaoxiao2021-02-28  11

1. XML-RPC

RPC (Remote Procedure Call) 远程过程调用, 提供一种“远程接口”来供外部系统调用, 常常用于不同平台,不同架构的系统之间的相互调用, 减少代码的冗余, 便于管理。

XML-RPC 是通过HTTP传输协议,XML作为传送信息的编码格式, 尽可能保持简单, 但同时能够传送,处理, 返回复杂的数据结构。因为是基于HTTP和XML, 所以兼容性比较好, 能够跨域不同的操作系统, 不同的编程语言, 但同时速度就会慢下来。

XML-RPC 一般有分为Server 和Client 端,  Client 向Server发送一个请求体为XML的HTTP POST请求, 被调用的方法在Server端将执行结果以XML格式返回。

Client --> xmlrpclib, 这个模块是用来调用注册在XML-RPC服务端的函数

Server --> SimpleXMLRPCServer, 这个模块用来构造一个最基本的XML-RPC服务器框架

2. XML-RPC 简单Python实现

Server 端:由于SimpleXMLRPCServer是单线程的,所以当多个客户端同时请求的时候, 就需要用到多线程。

#/usr/bin/env python3 import os from SimpleXMLRPCServer import SimpleXMLRPCServer from SocketServer import ThreadingMixIn 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 directory 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) def hello(): print "helloworld!" class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer): pass 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) #s = SimpleXMLRPCServer(('', 8000), allow_none=True) s = ThreadXMLRPCServer(('', 8000), allow_none=True) s.register_function(pwd) # register function s.register_function(ls) s.register_function(cd) s.register_function(mkdir) s.register_function(cp) s.register_function(hello) p = Person('python', 20) s.register_instance(p) s.serve_forever()

Client 端:

#!/usr/bin/env/python3 __author__ = "kenzhaoyihui" from xmlrpclib import ServerProxy s = ServerProxy("http://127.0.0.1:8000") s.hello() s.pwd() s.ls() s.cp('client_test.py', 'client_test_copy1.py') s.mkdir('tmp1') s.show()

Test from Terminal:

In [2]: from xmlrpclib import ServerProxy In [3]: x = ServerProxy("http://127.0.0.1:8000") In [4]: x.pwd() Out[4]: '/home/yzhao_sherry/work/learnpython3/RPC' In [5]: x.ls() Out[5]: ['server_xml_rpc.py', 'client_test.py'] In [6]: x.cp('client_test.py', 'client_test_copy.py') Out[6]: 'copy client_test.py-> client_test_copy.py' In [7]: x.mkdir('tmp') Out[7]: 'successfully create directory: tmp' In [8]: x.show() Out[8]: 'Person(name=python, age=20'

XML_RPC服务端创建步骤:1、 导入SimpleXMLRPCServer模块2、 实例化一个XML-RPC服务对象,在指定的端口监听请求server = SimpleXMLRPCServer(("localhost", 8000))3、 对函数的定义并把该函数注册到server端server.register_function(adder_function,'add')##adder_function是服务点定义的函数,add是客户端调用时用的函数。server.register_introspection_functions()##如果用到内部函数,需要把内部函数注册到服务端。server.register_instance(MyFuncs())##如果要注册的是一个类,可以利用这个函数把类中的方法全部注册到server端。4、服务端开始监听运行server.serve_forever()XML_RPC客户端创建步骤:1、 导入xmlrpclib库模块2、 创建一个代理到服务端proxy = xmlrpclib.ServerProxy('http://localhost:8000')##函数参数是URL格式3、通过代理就可以调用服务端的方法。

转载请注明原文地址: https://www.6miu.com/read-1450167.html

最新回复(0)