Tornado实现聊天室功能(websocket)

         小试了一把Tornado的websocket来实现聊天室的功能,非常简单,上代码:


服务器端:

import logging
import tornado.escape
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.websocket
import os.path
import uuid

from tornado.options import define, options

define("port", default=8888, help="run on the given port", type=int)


class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r"/", MainHandler),
            (r"/websocket", ChatSocketHandler),
        ]
        settings = dict(
            cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__",
            template_path=os.path.join(os.path.dirname(__file__), "templates"),
            static_path=os.path.join(os.path.dirname(__file__), "static"),
            xsrf_cookies=True,
        )
        tornado.web.Application.__init__(self, handlers, **settings)


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("index.html", messages=ChatSocketHandler.cache)

class ChatSocketHandler(tornado.websocket.WebSocketHandler):
    waiters = set()
    cache = []
    cache_size = 200

    def allow_draft76(self):
        # for iOS 5.0 Safari
        return True

    def open(self):
        print "new client opened"
        ChatSocketHandler.waiters.add(self)

    def on_close(self):
        ChatSocketHandler.waiters.remove(self)

    @classmethod
    def update_cache(cls, chat):
        cls.cache.append(chat)
        if len(cls.cache) > cls.cache_size:
            cls.cache = cls.cache[-cls.cache_size:]

    @classmethod
    def send_updates(cls, chat):
        logging.info("sending message to %d waiters", len(cls.waiters))
        for waiter in cls.waiters:
            try:
                waiter.write_message(chat)
            except:
                logging.error("Error sending message", exc_info=True)

    def on_message(self, message):
        logging.info("got message %r", message)

        ChatSocketHandler.send_updates(message)


def main():
    tornado.options.parse_command_line()
    app = Application()
    app.listen(8080)
    tornado.ioloop.IOLoop.instance().start()


if __name__ == "__main__":
    main()

客户端:

<html><head><title>Web Socket Client</title></head>  

<body>  

<script type="text/javascript">  

var socket;  

if (!window.WebSocket) {  

    window.WebSocket = window.MozWebSocket;  

}  

// Javascript Websocket Client  

if (window.WebSocket) {  

    socket = new WebSocket("ws://10.197.60.125:8080/websocket");  

    socket.onmessage = function(event) {  

        var ta = document.getElementById('responseText');  

        ta.value = ta.value + '\n' + event.data  

    };  

    socket.onopen = function(event) {  

        var ta = document.getElementById('responseText');  

        ta.value = "Web Socket opened!";  

    };  

    socket.onclose = function(event) {  

        var ta = document.getElementById('responseText');  

        ta.value = ta.value + "Web Socket closed";  

    };  

} else {  

    alert("Your browser does not support Web Socket.");  

}  

// Send Websocket data  

function send(message) {  

    if (!window.WebSocket) { return; }  

    if (socket.readyState == WebSocket.OPEN) {  

        socket.send(message);  

    } else {  

        alert("The socket is not open.");  

    }  

}  

</script>  

<h3>Send :</h3>  

<form οnsubmit="return false;">  

<input type="text" name="message" value="Hello World!"/><input type="button" value="Send Web Socket Data" οnclick="send(this.form.message.value)" />  

<h3>Receive :</h3>  

<textarea id="responseText" style="width:500px;height:300px;"></textarea>  

</form>  

</body>  

</html>  




  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值