Python中SimpleXMLRPCServer的使用与RPC原理详解
本文详细介绍Python中SimpleXMLRPCServer模块的使用方法,涵盖从注册函数、实例到复合调用的完整流程。同时解析RPC(远程过程调用)的基本概念、通信模式及在跨语言开发中的应用,帮助开发者快速构建基于XML-RPC的服务端与客户端。
利用SimpleXMLRPCServer模块构建RPC服务
模块概述
SimpleXMLRPCServer
该模块属于Python标准库的一部分,开发者无需进行额外的第三方安装即可直接使用。
需要注意的是,在Python 3版本中,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(Remote Procedure Call,远程过程调用)是为解决服务间信息交互而设计的技术。
RPC是一种通过网络从远程计算机程序请求服务的协议,其特点在于调用方无需了解底层网络通信技术的细节。
RPC采用经典客户机/服务器(Client/Server)架构模式。发起请求的一方为客户机,提供服务的一方为服务器。
通信流程首先由客户机进程发送包含进程参数的调用信息至服务进程,随后进入等待应答状态。
在服务器端,相关进程保持监听或睡眠状态,直至接收到调用信息。
一旦收到调用信息,服务器提取进程参数,执行计算逻辑,并将结果作为答复信息发送回客户端。
随后服务器继续等待下一个调用请求;客户端在接收到答复信息并获取结果后,继续执行后续流程。
RPC本质上是一种远程调用函数接口的机制,即客户端与服务器端约定好接口契约(函数签名),服务端持续监听并响应客户端的调用请求。
其交互模式类似于常见的Web网络请求。
主要应用场景之一是实现多台服务器之间的相互调用,以优化资源分配。
另一重要应用场景在于跨编程语言通信,由于不同编程语言均支持RPC标准,且Python内置相关支持库,无需额外安装,因此可直接在多语言混合的服务器环境中进行互操作调用。
底层而言,Socket编程构成了RPC通信的基础。
2. xmlrpc库应用
构建简单服务端
类似于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 #返回结果以上为个人经验分享,希望能为大家提供参考,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









