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-8
from tornado import websocket
import  tornado.httpserver
import tornado.web
import  tornado.ioloop

#官方Demo
class 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'弹窗,测试成功。

 

posted on 2016-10-07 11:32  wppele  阅读(421)  评论(0编辑  收藏  举报

导航