RPC简介
RPC是Remote Procedure Call的缩写,翻译成中文为:远程方法调用。
它是一种在本地机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了提高各个分立机器的“互操作性”而发明出来的技术。
XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用。
它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式。Xml-Rpc的定义尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。XML- RPC(http://www.xmlrpc.com)是由美国UserLand公司指定的一个RPC协议。简单的理解是:将数据定义为xml格式,通过http协议进行远程传输。
优点:
-
- 传输复杂的数据。
-
- 通过程序语言的封装,实现远程对象的调用。
Python下的XML-RPC
- 类库:SimpleXMLRPCServer
一般使用在服务器端,这个模块用来构造一个最基本的XML-RPC服务器框架。
- 类库:xmlrpclib
一般使用在客户端,这个模块用来调用注册在XML-RPC服务器端的函数,xmlrpclib并不是一个类型安全的模块,无法抵御恶意构造的数据,这方面的一些处理工作需要交给开发者自己。
大致用法:使用SimpleXMLRPCServer模块运行XMLRPC服务器,在其中注册服务器提供的函数或者对象;然后在客户端内使用xmlrpclib.ServerProxy连接到服务器,想要调用服务器的函数,直接调用ServerProxy即可
简单实现server(单线程或多线程),client,具体流程见代码部分,编码后启动server,再运行client。
1.server
# -*- coding: utf-8 -*-
# @Time : 2021-05-13 17:11
# @Author : davis
# @FileName: server.py
# @Software: PyCharm
from xmlrpc.server import SimpleXMLRPCServer
import sys
from SocketServer import ThreadingMixIn
class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):
pass
# 定义函数
def add(x, y):
print('func:{}, x:{}, y:{}'.format(sys._getframe().f_code.co_name,x,y))
return x + y
def divide(x, y):
print('func:{}, x:{}, y:{}'.format(sys._getframe().f_code.co_name, x, y))
return x - y
# 定义类
class HelloRpc:
def hello(self):
print('hello, xmlrpc.')
return 'xmlrpc'
# 1.创建server
server = SimpleXMLRPCServer(('127.0.0.1', 9090))
# 上面默认单线程,也可以创建多线程,但接受几个客户端请求时,挨个处理,客户端不改
server = ThreadXMLRPCServer(("localhost", 9090), allow_none=True)
print('listening on port 9090...')
# 2.注册多重调用函数
server.register_multicall_functions()
server.register_function(add, 'add')
server.register_function(divide, 'divide')
# 注册类对象
ins = HelloRpc()
server.register_instance(ins)
# 3.保持监听
server.serve_forever()
----------结果------------
listening on port 9090...
127.0.0.1 - - [13/May/2021 17:26:43] "POST /RPC2 HTTP/1.1" 200 -
func:add, x:53, y:85
func:divide, x:89, y:51
hello, xmlrpc.
2.client
# -*- coding: utf-8 -*-
# @Time : 2021-05-13 17:11
# @Author : davis
# @FileName: client.py
# @Software: PyCharm
from xmlrpc.client import ServerProxy, MultiCall
# 1.创建代理,ip,port保持和远程的调用对象保持一致
proxy = ServerProxy(('http://127.0.0.1:9090'))
# 2.连接代理
multicall = MultiCall(proxy)
# 3.调用远程对象函数
multicall.add(53,85)
multicall.divide(89,51)
# 调用远程对象的方法
multicall.hello()
# 4.获取此次调用结果,tuple封装
result = multicall()
print('calculation results: {0}, {1}, {2}'.format(result[0], result[1], result[2]))
----------结果------------
calculation results: 138, 38, xmlrpc