首页 > 代码库 > Python tornado初探

Python tornado初探

介绍

FriendFeed使用了一款使用 Python 编写的,相对简单的 非阻塞式 Web 服务器。其应用程序使用的 Web 框架看起来有些像 web.py 或者 Google 的 webapp, 不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化。

Tornado 就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。我们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。(关于如何扩容 服务器,以处理数以千计的客户端的连接的问题,请参阅 The C10K problem )

初次接触Tornado框架看简介也是云里雾里,先来简化一下现在的需求:

  • 本应用分为客户端和服务器端
  • 客户端点击按钮进行消息发送
  • 服务器端接收到客户端消息后进行回复
  • 客户端收到服务器端回复后进行弹框显示

需求简单,下面按照需求来一步一步实现:

客户端代码用MUI框架来实现

<!doctype html><html>    <head>        <meta charset="UTF-8">        <title>socket测试</title>        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />        <!--加载CSS样式文件-->        <link href="css/mui.min.css" rel="stylesheet" />        <!--用HTML5规范中的Websocket进行与服务器端的socket连接与通信 -->        <script type="text/javascript">            function socketTest(){                //此处的连接地址格式为(ws://服务器ip:规定端口号/服务器指定参数)                var wsServer = ws://192.168.0.32:9999/sok;                var ws = new WebSocket(wsServer);                ws.onopen = function(){                    console.log("open");                    //此处注意,只有写了onopen方法之后send方法才会起效                    ws.send("Hello");                }                //信息返回函数,服务器返回的信息在此处接收                ws.onmessage = function(msg){                    alert(msg.data);                };            }        </script>    </head>    <body>        <button type="button" class="mui-btn mui-btn-outlined" onclick="socketTest()">socket测试</button>        <script src="js/mui.min.js"></script>        <script type="text/javascript">            mui.init()        </script>    </body></html>

服务器端代码为python3+tornado

编码之前,先进性tornado模块的安装(pip install tornado)。

官方实例中只给了class中的内容,没有给出具体是如何调用的,再此列出详细调用过程。

#!/usr/bin/env python#coding=utf-8from tornado import websocketimport  tornado.httpserverimport tornado.webimport  tornado.ioloop#官方Democlass EchoWebSocket(websocket.WebSocketHandler):    #检查源,如果不加check_origin会报403错误    def check_origin(self, origin):        return True    def open(self):        print("websocket opened")    #参数中的message是客户端传进来的,此函数运行后将返回信息给客户端    def on_message(self, message):        self.write_message(u"You said" +message)    def on_close(self):        print("websocket closed")#url参数对应类,相当于MVC架构中的Congrol# 本例中客户端中的 ws://192.168.0.32:9999/sok  调用的就是EchoWebSocket类#如果有多个类,则写多个对应即可application = tornado.web.Application([    (r"/sok",EchoWebSocket)])#主函数规定端口号,并开启服务器进行监听if __name__ =="__main__":    application.listen(9999)    tornado.ioloop.IOLoop.instance().start()

运行调试

运行python代码开启服务器监听,回到客户端,点击 socket测试按钮,显示‘You said Hello‘弹窗,测试成功。

 

Python tornado初探