Tornado实现聊天室功能(websocket)

jopen 9年前

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