Tornado实现聊天室功能(websocket)

来源:互联网 发布:mfc编程实例讲解 编辑:程序博客网 时间:2024/05/16 00:49

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


服务器端:

import loggingimport tornado.escapeimport tornado.ioloopimport tornado.optionsimport tornado.webimport tornado.websocketimport os.pathimport uuidfrom tornado.options import define, optionsdefine("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>  




原创粉丝点击