前言:刚到公司三个多月,由于项目中大量使用xmlrpc所以就系统的看了基于python的xmlrpclib模块的使用方法。xmlrpclib主要根据python版本的不同分为两个区别较大的版本,本文内容是关于基于python3版本的xmlrpclib。本文主要借助一些demo从server和client两个部分进行叙述。
简介
rpc:远程过程调用协议。简单的来说就是客户端可以很方便得远程调用服务端的接口程序,而不用管底层是如何实现的。
xmlrpc:使用http协议作为传输协议的rpc机制。
rpc框架图,摘自https://www.zhihu.com/question/25536695
demo1.
以下是定义了一个函数的xmlrpc服务端,是最简单的demo
from xmlrpc.server import SimpleXMLRPCServer #导入模块
s = SimpleXMLRPCServer(("10.55.22.11",4242)) #服务端ip假设为10.55.22.11,端口假设为4242
def twice(x): #定义函数
return x*2
s.register_function(twice) #注册函数(让客户端发现)
s.serve_forever() #启动服务端
- 1
- 2
- 3
- 4
- 5
- 6
下面是该服务端对应的xmlrpc客户端
import xmlrpc.client #导入模块
s = xmlrpc.client.ServerProxy('http://10.55.22.11:4242') #链接服务端
print(s.twice(2)) #调用函数
- 1
- 2
- 3
调用成功成功后服务端会显示
demo2.
下面我想注册类方法函数,服务端如:
from xmlrpc.server import SimpleXMLRPCServer # 导入模块
s = SimpleXMLRPCServer(("10.81.10.57",4242)) # 设置服务端ip和端口
from xmlrpc.server import SimpleXMLRPCServer # 导入模块
s = SimpleXMLRPCServer(("10.81.10.57",4242)) # 设置服务端ip和端口
class Animal: #定义类
def rabit(self, amount):
return 4*amount
def chicken(self, amount):
return 2*amount
s.register_instance(Animal()) # 注册类方法函数(让客户端发现)
s.serve_forever() # 启动服务端
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
对应的客户端如下:
import xmlrpc.client # 导入模块
s = xmlrpc.client.ServerProxy('http://10.81.10.57:4242') # 链接服务端
print(s.rabit(2)) # 调用函数
print(s.chicken(2))
- 1
- 2
- 3
- 4
demo3
接下来要修改一些注册类方法函数接口的参数,对应的修改一下类定义。通过在类定义中添加—_dispatch方法可以在远程调用接口的时候经过_dispach。
服务端如下:
from xmlrpc.server import SimpleXMLRPCServer # 导入模块
s = SimpleXMLRPCServer(("10.81.10.57",4242)) # 设置服务端ip和端口
class Animal: # 定义类
def _dispatch(self, method, param): # 定义_dispatch方法
print(method) # 在服务端显示调用的方法名
func = getattr(self, method) # 调用接口
return func(*param)
def rabit(self, amount):
return 4*amount
def chicken(self, amount):
return 2*amount
s.register_instance(Animal()) # 注册函数(让客户端发现)
s.serve_forever() # 启动服务端
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
客户端如下:
import xmlrpc.client # 导入模块
s = xmlrpc.client.ServerProxy('http://10.81.10.57:4242') # 链接服务端
print(s.rabit(2)) # 调用函数
print(s.chicken(2))
- 1
- 2
- 3
参考:https://blog.csdn.net/u013761036/article/details/71599392