ioloop.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import tornado.websocket
  2. import time, json
  3. from collections import defaultdict, OrderedDict
  4. from .framework import Global, Msg, Task
  5. from os.path import abspath, dirname
  6. from tornado.web import StaticFileHandler
  7. from tornado.gen import coroutine,sleep
  8. project_dir = dirname(abspath(__file__))
  9. def start_ioloop(coro, port=8080):
  10. class EchoWebSocket(tornado.websocket.WebSocketHandler):
  11. def check_origin(self, origin):
  12. return True
  13. def get_compression_options(self):
  14. # Non-None enables compression with default options.
  15. return {}
  16. def open(self):
  17. print("WebSocket opened")
  18. self.set_nodelay(True)
  19. ############
  20. self.coros = [coro()]
  21. self.callbacks = OrderedDict() # UI元素时的回调, key -> callback, mark_id
  22. self.mark2id = {} # 锚点 -> id
  23. Global.active_ws = self
  24. next(self.coros[-1])
  25. @coroutine
  26. def on_message(self, message):
  27. print('on_message', message)
  28. # { event: , data: }
  29. data = json.loads(message)
  30. try:
  31. Global.active_ws = self
  32. res = self.coros[-1].send(data)
  33. while res is not None:
  34. print('get not none form coro ', res)
  35. yield res
  36. Global.active_ws = self
  37. res = self.coros[-1].send(data)
  38. except StopIteration:
  39. self.close()
  40. def on_close(self):
  41. print("WebSocket closed")
  42. handlers = [(r"/test", EchoWebSocket),
  43. (r"/(.*)", StaticFileHandler,
  44. {"path": '%s/html/' % project_dir,
  45. 'default_filename': 'index.html'})]
  46. app = tornado.web.Application(handlers=handlers, debug=True)
  47. http_server = tornado.httpserver.HTTPServer(app)
  48. http_server.listen(port)
  49. print('Open http://localhost:%s/ in Web browser' % port)
  50. tornado.ioloop.IOLoop.instance().start()