• Tornado/Python 学习笔记(一)


    1.源代码下载及安装:http://www.tornadoweb.org/en/stable/

    2.python中xmlrpc库官方文档:https://docs.python.org/3/library/xmlrpc.html?highlight=xmlrpc

    3.xml介绍与学习:http://www.w3school.com.cn/xml/xml_intro.asp

      XML 被设计为传输和存储数据,其焦点是数据的内容。

      HTML 被设计用来显示数据,其焦点是数据的外观。

      HTML 旨在显示信息,而 XML 旨在传输信息。

    python类库xmlrpc的使用

    一、简介

    XML-RPC is a Remote Procedure Call method that uses XML passed via HTTP as a transport. With it, a client can call methods with parameters on a remote server (the server is named by a URI) and get back structured data. This module supports writing XML-RPC client code; it handles all the details of translating between conformable Python objects and XML on the wire.

    简单地,client可以调用server上提供的方法,然后得到执行的结果。类似于webservice。

    为了解决在系统的80端口提供RPC的服务,而又不影响正在执行的WEB服务,人们想出了用HTTP协议传输RPC包的办法。对于几乎是专门用于传输文本的HTTP协议,要在其上传输RPC封包,最方便的方法莫过于把RPC封包编码成文本形式——例如XML文件。
    XML- RPC(http://www.xml-rpc.com)是由美国UserLand公司指定的一个RPC协议。它将RPC信息封包编码为XML,然后通过 HTTP传输封包;
    简单的理解:

    将数据定义为xml格式,通过http协议进行远程传输

    二、好处

    1. 传输复杂的数据。

    2. 通过程序语言的封装,实现远程对象的调用。

    三、Python中xmlrpc应用

    服务端:

     1 import calendar, SimpleXMLRPCServer
     2 #The server object
     3 class Calendar:
     4     def getMonth(self, year, month):
     5         return calendar.month(year, month)
     6     def getYear(self, year):
     7         return calendar.calendar(year)
     8         
     9 calendar_object = Calendar()
    10 server = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 7788))
    11 server.register_instance(calendar_object)
    12 #Go into the main listener loop
    13 print "Listening on port 7788"
    14 server.serve_forever()

    客户端:

    import xmlrpclib
    server = xmlrpclib.ServerProxy("http://localhost:7788")
    month = server.getMonth(2002, 8)
    print month

    执行结果:

        August 2002
    Mo Tu We Th Fr Sa Su
              1  2  3  4
     5  6  7  8  9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30 31

    PS1:以上代码的python环境为 python2.6,需要注意端口的使用情况,如果程序中使用的端口已经被占用会报错。

    当运行服务端的程序后,执行命令:netstat -an|grep 7788,显示以下信息:
    127.0.0.1.7788             *.*                0      0 128000      0 LISTEN

    PS2:SimpleXMLRPCServer是一个单线程的服务器。这意味着,如果几个客户端同时发出多个请求,其它的请求就必须等待第一个请求完成以后才能继续。

    这里有个技巧解决这个问题:

    from SimpleXMLRPCServer import SimpleXMLRPCServer
    from SocketServer import ThreadingMixIn
    class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):pass

    现在把服务端改一改:

     svr=ThreadXMLRPCServer(("", 8080), allow_none=True)

    现在服务器就支持多线程并发了。

    来源 -- http://blog.chinaunix.net/uid-20544356-id-132398.html

    服务端:

     1 from xmlrpc.server import SimpleXMLRPCServer
     2 from xmlrpc.server import SimpleXMLRPCRequestHandler
     3 
     4 def div(x,y):
     5     return x - y
     6     
     7 class Math:
     8     def _listMethods(self):
     9         # this method must be present for system.listMethods
    10         # to work
    11         return ['add', 'pow']
    12     def _methodHelp(self, method):
    13         # this method must be present for system.methodHelp
    14         # to work
    15         if method == 'add':
    16             return "add(2,3) => 5"
    17         elif method == 'pow':
    18             return "pow(x, y[, z]) => number"
    19         else:
    20             # By convention, return empty
    21             # string if no help is available
    22             return ""
    23     def _dispatch(self, method, params):
    24         if method == 'pow':
    25             return pow(*params)
    26         elif method == 'add':
    27             return params[0] + params[1]
    28         else:
    29             raise 'bad method'
    30 
    31 server = SimpleXMLRPCServer(("localhost", 8000))
    32 server.register_introspection_functions()
    33 server.register_function(div,"div")
    34 server.register_function(lambda x,y: x*y, 'multiply')
    35 server.register_instance(Math())
    36 server.serve_forever()

    客户端:

     1 import xmlrpc.client
     2 
     3 s = xmlrpc.client.ServerProxy('http://localhost:8000')
     4 
     5 print(s.system.listMethods())
     6 
     7 print(s.pow(2,3))  # Returns 8
     8 print(s.add(2,3))  # Returns 5
     9 print(s.div(3,2))  # Returns 1
    10 print(s.multiply(4,5)) # Returns 20

    执行结果:

    ['add', 'div', 'multiply', 'pow', 'system.listMethods', 'system.methodHelp', 'system.methodSignature']
    8
    5
    1
    20

    PS1:以上代码的python环境为 python3.2

  • 相关阅读:
    在cmd命令行中弹出Windows对话框
    Windows远程桌面连接如何直接使用剪贴板功能
    升级Windows10后Apache服务器启动失败的解决方法
    Windows下尝试PHP7提示丢失VCRUNTIME140.DLL的问题解决
    手动构建Servlet项目的流程
    更改Apache默认网站根目录
    windows下安装Appserv等php套件之后无法进入数据库管理的问题
    Java web项目的字符集问题
    五谷-小米:白小米
    五谷-小米:黑小米
  • 原文地址:https://www.cnblogs.com/fendou-999/p/3844827.html
Copyright © 2020-2023  润新知