python rpc 简单实现自带包xmlrpc

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协议进行远程传输。

优点:

    1. 传输复杂的数据。
    1. 通过程序语言的封装,实现远程对象的调用。

Python下的XML-RPC

  1. 类库:SimpleXMLRPCServer

  一般使用在服务器端,这个模块用来构造一个最基本的XML-RPC服务器框架。

  1. 类库: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

posted on 2021-05-13 17:36  进击的davis  阅读(203)  评论(0编辑  收藏  举报

导航