zoukankan      html  css  js  c++  java
  • Python中关于XML-RPC原理

      SimpleXMLRPCServer模块为XML-RPC服务端的写入提供了一个基本的框架。利用SimpleXMLRPCServer服务器既可以一直空闲,也可以利用CGIXMLRPCRequestHandler来嵌入到一个CGI环境中。
      XML-RPC(Remote Procedure Call)是通过HTTP传输协议,利用XML格式的远端程序调用方法。客户端可以调用服务端带参数的方法并获取返回的结构数据。(服务端的名字是一个URI)。这个模块支持写入XML-RPC端的代码。它用来处理所有转换的细节在在整合的Python对象和XML报文之间。

    Eg1服务端代码:

     1 from SimpleXMLRPCServer import SimpleXMLRPCServer
     2 from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
     3 
     4 class RequestHandler(SimpleXMLRPCRequestHandler):
     5     rpc_paths = ('/RPC2')
     6    
     7 server = SimpleXMLRPCServer(("localhost", 8000),requestHandler = RequestHandler)
     8 #server = SimpleXMLRPCServer(("localhost", 8000))
     9 server.register_introspection_functions()
    10 
    11 server.register_function(pow)
    12 
    13 def adder_function(x,y):
    14     return x+y
    15 server.register_function(adder_function,'add')
    16 
    17 class MyFuncs:
    18     def div(self, x, y):
    19         return x//y
    20 server.register_instance(MyFuncs())
    21 server.serve_forever()

    Eg1客户端代码:

    1 import xmlrpclib
    2 
    3 s = xmlrpclib.ServerProxy('http://localhost:8000')
    4 print s.pow(2,3)
    5 print s.add(2,3)
    6 print s.div(5,2)
    7 
    8 print s.system.listMethods()

    XML_RPC服务端创建步骤:
    1、 导入SimpleXMLRPCServer模块
    2、 实例化一个XML-RPC服务对象,在指定的端口监听请求
    server = SimpleXMLRPCServer(("localhost", 8000))
    3、 对函数的定义并把该函数注册到server端
    server.register_function(adder_function,'add')##adder_function是服务点定义的函数,add是客户端调用时用的函数。
    server.register_introspection_functions()##如果用到内部函数,需要把内部函数注册到服务端。
    server.register_instance(MyFuncs())##如果要注册的是一个类,可以利用这个函数把类中的方法全部注册到server端。
    4、服务端开始监听运行server.serve_forever()
    XML_RPC客户端创建步骤:
    1、 导入xmlrpclib库模块
    2、 创建一个代理到服务端
    proxy = xmlrpclib.ServerProxy('http://localhost:8000')##函数参数是URL格式
    3、通过代理就可以调用服务端的方法。

    Eg2服务端代码:

     1 import datetime
     2 from SimpleXMLRPCServer import SimpleXMLRPCServer
     3 import xmlrpclib
     4 
     5 def today():
     6     today = datetime.datetime.today()
     7     return xmlrpclib.DateTime(today)
     8 def add(x,y):
     9     return x+y
    10 def subtract(x,y):
    11     return x-y
    12 def multiply(x,y):
    13     return x*y
    14 def divide(x,y):
    15     return x/y
    16 
    17 server = SimpleXMLRPCServer(("localhost", 8001))
    18 print "Listening on port 8001..."
    19 server.register_multicall_functions()
    20 server.register_function(today, "today")
    21 server.register_function(add, "add")
    22 server.register_function(subtract, "subtract")
    23 server.register_function(multiply, "multiply")
    24 server.register_function(divide, "divide")
    25 server.serve_forever()

    注意:
    server.register_multicall_functions()##这个函数的作用是可以使客户端同时调用服务端的的多个函数。

    Eg2客户端代码:

     1 import xmlrpclib
     2 import datetime
     3 
     4 proxy = xmlrpclib.ServerProxy("http://localhost:8001/")
     5 
     6 print proxy.add(7,3)
     7 print proxy.subtract(7,3)
     8 print proxy.multiply(7,3)
     9 print proxy.divide(7,3)
    10 today = proxy.today()
    11 multicall = xmlrpclib.MultiCall(proxy)
    12 multicall.today()
    13 multicall.add(7,3)
    14 multicall.subtract(7,3)
    15 multicall.multiply(7,3)
    16 multicall.divide(7,3)
    17 result = multicall()
    18 
    19 # convert the ISO8601 string to a datetime object
    20 converted = datetime.datetime.strptime(today.value, "%Y%m%dT%H:%M:%S")
    21 print "Today: %s" % converted.strftime("%d.%m.%Y, %H:%M")
    22 print "Today1: %s, 7+3=%d, 7-3=%d, 7*3=%d, 7/3=%d" % tuple(result)

    注意:
     multicall = xmlrpclib.MultiCall(proxy)
     ……
    result = multicall()##将这两个函数之间的返回值写入到result中。

  • 相关阅读:
    手机评測怎么看?
    【c++】简单的string类的几个基本函数
    免费软件怎样赚钱?
    【leetcode】Swap Nodes in Pairs (middle)
    【leetcode】Divide Two Integers (middle)☆
    【leetcode】4Sum(middle)
    【leetcode】Longest Common Prefix (easy)
    【leetcode】3Sum Closest(middle)
    【leetcode】Container With Most Water(middle)
    【leetcode】Palindrome Number (easy)
  • 原文地址:https://www.cnblogs.com/wanghaoran/p/3189017.html
Copyright © 2011-2022 走看看