前言:刚到公司三个多月,由于项目中大量使用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