python使用SimpleXMLRPCServer实现简单的rpc过程

 更新时间:2022年06月18日 09:32:57   作者:comprel  
这篇文章主要介绍了python使用SimpleXMLRPCServer实现简单的rpc过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

使用SimpleXMLRPCServer实现rpc

模块

  • SimpleXMLRPCServer

python标准库中自带的模块,无需另外安装

在python3中 SimpleXMLRPCServer已经被合并到xmlrpc.server

定义

class SimpleXMLRPCServer.SimpleXMLRPCServer(addr[, requestHandler[, logRequests[, allow_none[, encoding[, bind_and_activate]]]])

方法

1.SimpleXMLRPCServer.register_function(function[, name])

  • 注册一个方法,服务

2.SimpleXMLRPCServer.register_instance(instance[, allow_dotted_names])

  • 注册实例
  • 一个对象在register_function注册后则,不能再在register_instance注册

3.SimpleXMLRPCServer.register_introspection_functions()

  • 注册一个反函数

4.SimpleXMLRPCServer.register_multicall_functions()

  • 注册复合函数

例如:

服务端

from SimpleXMLRPCServer import SimpleXMLRPCServer   
def respon_string(str):
    return "get string :%s"%str

if __name__ == '__main__':
    s = SimpleXMLRPCServer(('0.0.0.0', 8080))
    s.register_function(respon_string,"get_string")
    s.serve_forever()

客服端

from xmlrpclib import ServerProxy
if __name__ == '__main__':
    s = ServerProxy("http://192.168.137.9:8080")
    print s.get_string("hello") 

结果:

# python get.py 
get string :hello

服务端:

#coding=utf8
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler

class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)
server = SimpleXMLRPCServer(("0.0.0.0", 8000),
                            requestHandler=RequestHandler)

print "start service on 0.0.0.0:8000"                            
server.register_introspection_functions()

#注册pow,幂运算,实际调用的是已有的算数pow()
server.register_function(pow)

def add(x,y):
    return x + y
server.register_function(add, 'add')

#注方法在xml-rpc中都是public的

class fun:
    def div(self, x, y):
        return x // y

server.register_instance(fun())
server.serve_forever()

客服端:

可以使用下面的方法调用:

import xmlrpclib

s = xmlrpclib.ServerProxy('http://192.168.137.9:8000')
print s.pow(3,5) 
print s.add(3,9) 
print s.div(7,3) 

print s.system.listMethods()

结果:

243
12
2
['add', 'div', 'pow', 'system.listMethods', 'system.methodHelp', 'system.methodSignature']

register_multicall_functions实现复合调用,多个方法注册到一个调用里

#coding=utf8

from SimpleXMLRPCServer import SimpleXMLRPCServer

server = SimpleXMLRPCServer(("0.0.0.0", 8000))
server.register_function(pow)
server.register_function(lambda x,y: x+y, 'add')
server.register_multicall_functions()
server.serve_forever()

MultiCall调用复合方法

import xmlrpclib
s = xmlrpclib.ServerProxy("http://192.168.137.9:8000")
print s
multi = xmlrpclib.MultiCall(s)
multi.pow(2, 5)
try:
    for response in multi():
        print response
except Error, err:
    print "ERROR", err   

结果:

# python jm.py 
<ServerProxy for 192.168.137.9:8000/RPC2>
32

python与rpc服务

RPC

1.什么是RPC

RPC 就是为解决服务之间信息交互而发明和存在的。

RPC(Remote Procedure Call)——远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。

首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。

在服务器端,进程保持睡眠状态直到调用信息到达为止。

当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息

然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

RPC就是一种远程调用函数接口的方式,说白了,就是一种远程调用函数接口的方式,客户端和服务端之间约定一种契约(函数接口),然后服务端一直等待客户端的调用。

有点像平常的WEB网络请求。

一种用途是在多台服务器之间互相进行调用。

另一个用途则在于,不同编程语言之间都支持这种方式,像Python更是内置对其的支持,不需要额外安装什么库,所以可以直接在多语言的服务器之间互相进行调用。

Socket编程就是RPC通信

2.xmlrp库

简单的服务端

像web请求一样,我们需要确定供客户端访问的url和端口号,以及供客户端调用的方法实现,最后要让我们服务器一直处于等待被访问的状态:

rpc_server.py
from xmlrpc.server import SimpleXMLRPCServer

调用函数

def respon_string(str):
return “get string:%s”%str

if name == ‘main':
server = SimpleXMLRPCServer((‘localhost', 8888)) # 初始化
server.register_function(respon_string, “get_string”) # 注册get_string函数
print (“Listening for Client”)
server.serve_forever() # 保持等待调用状态
rpc_client.py
from xmlrpc.client import ServerProxy

if name == ‘main':
server = ServerProxy(“http://localhost:8888”) # 初始化服务器
print (server.get_string(“RPC RPC”)) # 调用get_string函数并传参,调用get_string让服务端通过respon_string函数处理请求,并返回。

操作

#服务端启动:
[root@xujunk tmp]#python3 rpc_server.py
Listening for Client
#客户端启动:
[root@xujunk tmp]#python3 rpc_client.py
get string:RPC RPC #返回结果

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Django框架表单操作实例分析

    Django框架表单操作实例分析

    这篇文章主要介绍了Django框架表单操作,结合实例形式分析了Django框架表单数据发送、请求相关操作技巧与注意事项,需要的朋友可以参考下
    2019-11-11
  • Python使用urllib2模块抓取HTML页面资源的实例分享

    Python使用urllib2模块抓取HTML页面资源的实例分享

    这篇文章主要介绍了Python使用urllib2模块抓取HTML页面资源的实例分享,将要抓取的页面地址写在单独的规则列表中方便组织和重复使用,需要的朋友可以参考下
    2016-05-05
  • Python中文竖排显示的方法

    Python中文竖排显示的方法

    这篇文章主要介绍了Python中文竖排显示的方法,可实现Python将中文竖排输出显示的功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 详解pygame中Rect对象

    详解pygame中Rect对象

    Rect是pygame中的一个创建矩形的对象,它包含一些属性主要是两块:坐标和长宽,Pygame 通过 Rect 对象存储和操作矩形区域,这篇文章主要介绍了pygame中Rect对象,需要的朋友可以参考下
    2022-07-07
  • 利用Python破解验证码实例详解

    利用Python破解验证码实例详解

    这篇文章主要给大家介绍的是如何通过一个简单的例子来实现破解验证码。从本文中我们可以学习到 Python 基本知识,PIL 模块的使用,破解验证码的原理。文中通过实例一步步介绍的很详细,相信对大家理解和学习具有一定的参考借鉴价值,有需要的朋友们下面来一起看看吧。
    2016-12-12
  • 简单理解Python中的装饰器

    简单理解Python中的装饰器

    这篇文章主要介绍了Python中的装饰器,是Python入门学习中的基础知识,需要的朋友可以参考下
    2015-07-07
  • python爬取B站关注列表及数据库的设计与操作

    python爬取B站关注列表及数据库的设计与操作

    这篇文章主要为大家介绍了python爬取B站关注列表及数据库的设计与操作,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Python实现屏幕截图的两种方式

    Python实现屏幕截图的两种方式

    这篇文章主要介绍了Python实现屏幕截图的两种方式及对这两者的特点和用法进行详细解释,感兴趣的朋友一起看看
    2018-02-02
  • 基于scrapy实现的简单蜘蛛采集程序

    基于scrapy实现的简单蜘蛛采集程序

    这篇文章主要介绍了基于scrapy实现的简单蜘蛛采集程序,实例分析了scrapy实现采集程序的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • 详解Python如何生成词云的方法

    详解Python如何生成词云的方法

    这篇文章主要介绍了详解Python如何生成词云的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06

最新评论