1
0

tornado.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import json
  2. import asyncio
  3. import tornado
  4. import tornado.websocket
  5. from ..session import AsyncBasedSession, ThreadBasedWebIOSession, get_session_implement
  6. def webio_handler(task_func, debug=True):
  7. class WSHandler(tornado.websocket.WebSocketHandler):
  8. def check_origin(self, origin):
  9. return True
  10. def get_compression_options(self):
  11. # Non-None enables compression with default options.
  12. return {}
  13. def send_msg_to_client(self, controller: AsyncBasedSession):
  14. for msg in controller.get_task_messages():
  15. self.write_message(json.dumps(msg))
  16. def open(self):
  17. print("WebSocket opened")
  18. self.set_nodelay(True)
  19. self._close_from_session = False # 是否从session中关闭连接
  20. if get_session_implement() is AsyncBasedSession:
  21. self.controller = AsyncBasedSession(task_func, on_task_message=self.send_msg_to_client,
  22. on_session_close=self.close)
  23. else:
  24. self.controller = ThreadBasedWebIOSession(task_func, on_task_message=self.send_msg_to_client,
  25. on_session_close=self.close_from_session,
  26. loop=asyncio.get_event_loop())
  27. print('open return, ThreadBasedWebIOSession.thread2session', ThreadBasedWebIOSession.thread2session)
  28. def on_message(self, message):
  29. # print('on_message', message)
  30. data = json.loads(message)
  31. self.controller.send_client_event(data)
  32. def close_from_session(self):
  33. self._close_from_session = True
  34. self.close()
  35. def on_close(self):
  36. if not self._close_from_session:
  37. self.controller.close(no_session_close_callback=True)
  38. print("WebSocket closed")
  39. return WSHandler