代码服务器端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 onsubmit="return false;">  

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

<h3>Receive :</h3>  

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

</form>  

</body>  

</html>

    

    

文章结束给大家分享下程序员的一些笑话语录: 问:你觉得让你女朋友(或者任何一个女的)从你和李彦宏之间选一个,你觉得她会选谁?  
  答:因为李艳红这种败类,所以我没女友!

posted @ 2013-05-09 19:46  xinyuyuanm  阅读(572)  评论(0编辑  收藏  举报