zoukankan      html  css  js  c++  java
  • 代码服务器端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="500px;height:300px;"></textarea>  
    
    </form>  
    
    </body>  
    
    </html>

        

        

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

  • 相关阅读:
    PAT B1027 打印沙漏 (20 分)
    PAT B1025 反转链表 (25 分)
    PAT B1022 D进制的A+B (20 分)
    PAT B1018 锤子剪刀布 (20 分)
    PAT B1017 A除以B (20 分)
    PAT B1015 德才论 (25 分)
    PAT B1013 数素数 (20 分)
    PAT B1010 一元多项式求导 (25 分)
    HDU 1405 The Last Practice
    HDU 1165 Eddy's research II
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3069697.html
Copyright © 2011-2022 走看看