python怎么使用SimpleXMLRPCServer实现简单的rpc过程
这篇文章主要介绍了python怎么使用SimpleXMLRPCServer实现简单的rpc过程的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python怎么使用SimpleXMLRPCServer实现简单的rpc过程文章都会有所收获,下面我们一起来看看吧。
使用SimpleXMLRPCServer实现rpc
模块
SimpleXMLRPCServer
python标准库中自带的模块,无需另外安装
在python3中 SimpleXMLRPCServer已经被合并到xmlrpc.server
定义
class SimpleXMLRPCServer.SimpleXMLRPCServer(addr[, requestHandler[, logRequests[, allow_none[, encoding[, bind_and_activate]]]])
方法
SimpleXMLRPCServer.register_function(function[, name])
注册一个方法,服务
SimpleXMLRPCServer.register_instance(instance[, allow_dotted_names])
注册实例
一个对象在register_function注册后则,不能再在register_instance注册
SimpleXMLRPCServer.register_introspection_functions()
注册一个反函数
SimpleXMLRPCServer.register_multicall_functions()
注册复合函数
例如:
服务端
from SimpleXMLRPCServer import SimpleXMLRPCServer def respon_string(str): return "get string :%s"%strif __name__ == '__main__': s = SimpleXMLRPCServer(('0.0.0.0', 8080)) s.register_function(respon_string,"get_string") s.serve_forever()
客服端
from xmlrpclib import ServerProxyif __name__ == '__main__': s = ServerProxy("http://192.168.137.9:8080") print s.get_string("hello")
结果:
# python get.py
get string :hello
服务端:
#coding=utf8from SimpleXMLRPCServer import SimpleXMLRPCServerfrom SimpleXMLRPCServer import SimpleXMLRPCRequestHandlerclass 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 + yserver.register_function(add, 'add')#注方法在xml-rpc中都是public的class fun: def div(self, x, y): return x // yserver.register_instance(fun())server.serve_forever()
客服端:
可以使用下面的方法调用:
import xmlrpclibs = 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=utf8from SimpleXMLRPCServer import SimpleXMLRPCServerserver = 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 xmlrpclibs = xmlrpclib.ServerProxy("http://192.168.137.9:8000")print smulti = xmlrpclib.MultiCall(s)multi.pow(2, 5)try: for response in multi(): print responseexcept 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.pyfrom xmlrpc.server import SimpleXMLRPCServer
调用函数
def respon_string(str):return “get string:%s”%strif name == ‘main':server = SimpleXMLRPCServer((‘localhost', 8888)) # 初始化server.register_function(respon_string, “get_string”) # 注册get_string函数print (“Listening for Client”)server.serve_forever() # 保持等待调用状态rpc_client.pyfrom xmlrpc.client import ServerProxyif 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.pyListening for Client#客户端启动:[root@xujunk tmp]#python3 rpc_client.pyget string:RPC RPC #返回结果
关于“python怎么使用SimpleXMLRPCServer实现简单的rpc过程”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“python怎么使用SimpleXMLRPCServer实现简单的rpc过程”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341