当前位置 主页 > 服务器问题 > Linux/apache问题 >

    python远程调用rpc模块xmlrpclib的方法

    栏目:Linux/apache问题 时间:2019-11-18 15:20

    RPC(Remote Procedure Call Protocol)是远程调用协议,它通过网络请求服务到远端服务器,服务器根据请求做出响应,将结果返回

    它是一种C/S模式,客户端可以调用远程服务器上的参数(类似URL)并返回结果

    利用rpc可以实现系统的分布式架构,可以将功能分解到多台服务器上进行实现,同时也将也可以将负载打散,分布到不同服务器上,整合计算资源

    在openstack中就大量使用了rpc

    rpc多使用http传输请求,格式有xml,json等,这里是xml

    模块:

    xmlrpclib

    注:xmlrpclib模块在python3中重命名为xmlrpc.client

    xmlrpc并不是很安全,但在2.7.9 https url中默认加入了证书,主机名验证

    定义:

    class xmlrpclib.ServerProxy(uri[, transport[, encoding[, verbose[, allow_none[, use_datetime[, context]]]]]])

    1.uri,即服务端的url地址

    2.transport 传输实例,可选,https urls/http

    3.encoding

    4.verbose 是debug模式

    5.allow_none 是否请求空 ,若为True,那么常量none将被翻译成xml,默认如果是none则抛出异常 TypeError

    6.use_datetime 可以使用date/time values记录调用时间datetime.datetime,默认是false

    ServerProxy对象提供一些默认的方法:

    1.ServerProxy.system.listMethods() 返回远端服务器方法列表

    2.ServerProxy.system.methodSignature(name) 方法签名,是一个数组类型

    3.ServerProxy.system.methodHelp(name) 方法帮助信息

    例如一个简单的示例:

    服务端:

    import xmlrpclib
    from SimpleXMLRPCServer import SimpleXMLRPCServer
    
    def get_power(n,m):
     return n**m
    
    server = SimpleXMLRPCServer(("0.0.0.0", 8081))
    print "start service get power on 0.0.0.0 8081..."
    server.register_function(get_power, "get_power")
    server.serve_forever()
    

    客服端:

    import xmlrpclib
    
    server_power = xmlrpclib.ServerProxy("http://192.168.137.9:8081/")
    print "3**2 = %d" %(server_power.get_power(3,2))
    print "2**5 = %d" %(server_power.get_power(2,5))
    

    结果:

    服务端:

    # python xml_server.py 
    start service get power on 0.0.0.0 8081...
    
    192.168.137.9 - - [22/May/2017 10:37:47] "POST / HTTP/1.1" 200 -
    192.168.137.9 - - [22/May/2017 10:37:47] "POST / HTTP/1.1" 200 -
    

    客服端:

    # python xml_client.py 
    3**2 = 9
    2**5 = 32

    xmlrpclib提供的一些方法:

    class xmlrpclib.DateTime 时间对象

    例如:

    服务端:

    import datetime
    from SimpleXMLRPCServer import SimpleXMLRPCServer
    import xmlrpclib
    
    def today():
     today = datetime.datetime.today()
     return xmlrpclib.DateTime(today)
    
    server = SimpleXMLRPCServer(("0.0.0.0", 8081))
    print "start service on 0.0.0.0 8081..."
    server.register_function(today, "today")
    server.serve_forever()
    

    客服端:

    import xmlrpclib
    import datetime
    
    s = xmlrpclib.ServerProxy("http://192.168.137.9:8081/")
    
    today = s.today()
    converted = datetime.datetime.strptime(today.value, "%Y%m%dT%H:%M:%S")
    print "Today: %s" % converted.strftime("%d.%m.%Y, %H:%M")
    

    结果:

    服务端