用tornado实现websocket

import tornado.web
import tornado.websocket
import tornado.httpserver
import tornado.ioloop
import tornado.options
from uuid import uuid4

class ShoppingCart(object):
    totalInventory = 10
    callbacks = []
    carts = {}

    def register(self, callback):
        self.callbacks.append(callback)

    def unregister(self, callback):
        self.callbacks.remove(callback)

    def moveItemToCart(self, session):
        if session in self.carts:
            return

        self.carts[session] = True
        self.notifyCallbacks()

    def removeItemFromCart(self, session):
        if session not in self.carts:
            return

        del(self.carts[session])
        self.notifyCallbacks()

    def notifyCallbacks(self):
        for callback in self.callbacks:
            callback(self.getInventoryCount())

    def getInventoryCount(self):
        return self.totalInventory - len(self.carts)

class DetailHandler(tornado.web.RequestHandler):
    def get(self):
        session = uuid4()
        count = self.application.shoppingCart.getInventoryCount()
        self.render("index.html", session=session, count=count)

class CartHandler(tornado.web.RequestHandler):
    def post(self):
        action = self.get_argument(‘action‘)
        session = self.get_argument(‘session‘)

        if not session:
            self.set_status(400)
            return

        if action == ‘add‘:
            self.application.shoppingCart.moveItemToCart(session)
        elif action == ‘remove‘:
            self.application.shoppingCart.removeItemFromCart(session)
        else:
            self.set_status(400)

class StatusHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        self.application.shoppingCart.register(self.callback)

    def on_close(self):
        self.application.shoppingCart.unregister(self.callback)

    def on_message(self, message):
        pass

    def callback(self, count):
        self.write_message(‘{"inventoryCount":"%d"}‘ % count)

class Application(tornado.web.Application):
    def __init__(self):
        self.shoppingCart = ShoppingCart()

        handlers = [
            (r‘/‘, DetailHandler),
            (r‘/cart‘, CartHandler),
            (r‘/cart/status‘, StatusHandler)
        ]

        settings = {
            ‘template_path‘: ‘templates‘,
            ‘static_path‘: ‘static‘
        }

        tornado.web.Application.__init__(self, handlers, **settings)

if __name__ == ‘__main__‘:
    tornado.options.parse_command_line()

    app = Application()
    server = tornado.httpserver.HTTPServer(app)
    server.listen(8000)
    tornado.ioloop.IOLoop.instance().start()

Tornado在websocket模块中提供了一个WebSocketHandler类。这个类提供了和已连接的客户端通信的WebSocket事件和方法的钩子。当一个新的WebSocket连接打开时,open方法被调用,而on_messageon_close方法分别在连接接收到新的消息和客户端关闭时被调用。

此外,WebSocketHandler类还提供了write_message方法用于向客户端发送消息,close方法用于关闭连接。

class EchoHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        self.write_message(‘connected!‘)

    def on_message(self, message):
        self.write_message(message)

正如你在我们的EchoHandler实现中所看到的,open方法只是使用WebSocketHandler基类提供的write_message方法向客户端发送字符串"connected!"。每次处理程序从客户端接收到一个新的消息时调用on_message方法,我们的实现中将客户端提供的消息原样返回给客户端

时间: 2024-10-25 20:48:52

用tornado实现websocket的相关文章

Tornado-第三篇-tornado支持websocket协议

manage.py from tornado.ioloop import IOLoop from tornado.web import RequestHandler from tornado.websocket import WebSocketHandler from tornado.web import Application CLIENT_LIST = [] class MsgHandler(WebSocketHandler): def open(self): CLIENT_LIST.app

基于Tornado的websocket实现聊天室

self.render-string() 渲染成字符串 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .container{ border: 2px solid #dddddd; height: 400px; overflow: auto; } &

tornado+websocket+mongodb实现在线视屏文字聊天

最近学了tornado和mongo,所以结合websocket 实现一个聊天功能,从而加深一下相关知识点的印象 1.websocket概览 webscoket是一种全双工通信模式的协议,客户端连接服务端先通过tcp,http转为webscoket协议后,客户端和服务端都可以主动推送消息给另一端,这也是和http协议(服务端只能被动接收消息,无法主动推送消息给客户端)最大的区别. 2.tornado概览 tornado是一种异步网络库的python web框架,最初在 FriendFeed上开发,

《Introduction to Tornado》中文翻译计划——第五章:异步Web服务

http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth310/itt2zh上面持续更新,本文内容可能不是最新状态,请在GitHub上获得最新版本. 本文也可在http://demo.pythoner.com/itt2zh上进行格式化的预览. 第五章:异步Web服务 到目前为止,我们已经看到了许多使Tornado成为一个Web应用强有力框架的功能.它的简单性.易用性

Python tornado初探

介绍 FriendFeed使用了一款使用 Python 编写的,相对简单的 非阻塞式 Web 服务器.其应用程序使用的 Web 框架看起来有些像 web.py 或者 Google 的 webapp, 不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化. Tornado 就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服

基于WebSocket构建移动端实时应用

对于传统的网络应用,大部分情况下使用的是Http短连接,这意味着你发送一次请求,服务器给你返回响应信息,然后连接就被断掉了.然而现实生活 中,很多应用实际上是需要一种实时机制的支持,比如微信,你就需要实时收到对方发送的回复信息. 前言 对于传统的网络应用,大部分情况下使用的是Http短连接,这意味着你发送一次请求,服务器给你返回响应信息,然后连接就被断掉了.然而现实生活 中,很多应用实际上是需要一种实时机制的支持,比如微信,你就需要实时收到对方发送的回复信息.对于应用处于后台的情况下,你可以使用

websocket介绍

websocket应用 手动实现的websocket 你所见过的websocket 你一定见过在网站中,有一个游客聊天的聊天框,比如人人影视.这个聊天框是如何实现即时通讯的呢,就是用到了websocket 你可以打开浏览器的network,会看到有个ws://xxxxx,这就代表了是websocket做的 那么什么是websocket? websocket就是一套协议. 看名字,虽然有个websocket,但他和http协议一样,也要走socket. 不同的是:http是短连接,处理完一个请求就

websocket应用

<!doctype html>websocket应用.md html { } .CodeMirror { height: auto } .CodeMirror-scroll { } .CodeMirror-lines { padding: 4px 0px } .CodeMirror pre { } .CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler { background-color: white } .CodeMirror-gutt

websocket基本概念

(1)websocket 协议 与 http协议 websocket 协议,双工通道 socket连接不断开 http 协议 ,只能请求响应 (用户主动获取) socket连接断开 都是基于socket ---- 客户端都是浏览器 (2)轮询 一般用户量少的 都是用 websocket来做即时通讯 轮询 --- 一直发请求,定死的,2秒钟取一次 长轮询 --- 请求之后,没有新消息,夯住,30秒之内没有新消息,断开 重新请求,如果有新消息,立刻返回消息 (3) ws 协议小例 创建 socket