Tornado實現聊天室功能(websocket)

jopen 10年前發布 | 50K 次閱讀 Tornado Python開發

         小試了一把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>  

來自:http://blog.csdn.net/lrenjun/article/details/8906099

 

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!