• 代码服务器端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>

        

        

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

  • 相关阅读:
    Ajax笔记(三)
    Ajax笔记(二)
    org.apache.commons.lang.StringUtils中常用的方法
    数位dp poj1850
    二分图 最小点覆盖 poj 3041
    poj 1789 prime
    c++三种进制格式
    c++面向行的输入getline()和get()
    最小生成树 prime算法 UVALive
    最短路 poj1125
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3069697.html
Copyright © 2020-2023  润新知