diff options
author | Aaron LI <aaronly.me@outlook.com> | 2016-11-16 21:36:44 +0800 |
---|---|---|
committer | Aaron LI <aaronly.me@outlook.com> | 2016-11-16 21:36:44 +0800 |
commit | 123783f6b683177781b0b579cbc0eaddcafb756a (patch) | |
tree | 7a3b3cac8c6f35aa98d56b680346d6b2c02fc40d /fg21sim | |
parent | e6e3027e6dd29febd1e72ad044ba3ccc1cd455a5 (diff) | |
download | fg21sim-123783f6b683177781b0b579cbc0eaddcafb756a.tar.bz2 |
webui: websocket.py: Do not handle "configs" and "console" messages
The handling of "configs" and "console" types of messages, will be
changed to implement using the AJAX techniques.
The basic WebSocket communication is too low-level, and there is no easy
way to relate each received message to the corresponding sent message.
There are high-level sub-protocols exists (e.g., WAMP [1]) to allow the
RPC (remote procedure call) and publish/subscribe operations, however,
the Tornado web framework current does not support them, and another
client JavaScript library is also required.
Using the more traditional AJAX techniques allow the request-response
model and sequential operations (e.g., jQuery deferred and promises) be
easily implemented. Therefore better operation interaction and
reflection and error handling is achieved.
[1]: WAMP: Web Application Messaging Protocl, http://wamp-proto.org/
Diffstat (limited to 'fg21sim')
-rw-r--r-- | fg21sim/webui/handlers/websocket.py | 38 |
1 files changed, 6 insertions, 32 deletions
diff --git a/fg21sim/webui/handlers/websocket.py b/fg21sim/webui/handlers/websocket.py index 9dc1c40..81e5ba3 100644 --- a/fg21sim/webui/handlers/websocket.py +++ b/fg21sim/webui/handlers/websocket.py @@ -17,14 +17,12 @@ References http://caniuse.com/#feat=websockets """ -import json import logging import tornado.websocket +from tornado.escape import json_decode, json_encode from tornado.options import options -from .console import ConsoleHandler -from .configs import ConfigsHandler from ..utils import get_host_ip, ip_in_network @@ -93,22 +91,12 @@ class WSHandler(tornado.websocket.WebSocketHandler): self.application.ws_clients.add(self) logger.info("Added new opened WebSocket client: {0}".format(self)) self.configs = self.application.configmanager - self.console_handler = ConsoleHandler(websocket=self) - self.configs_handler = ConfigsHandler(configs=self.configs) # Push current configurations to the client self._push_configs() def on_close(self): """Invoked when a new WebSocket is closed by the client.""" # Remove from the set of current connected clients - code, reason = None, None - if hasattr(self, "close_code"): - code = self.close_code - if hasattr(self, "close_reason"): - reason = self.close_reason - logger.warning("WebSocket: {0}: closed by client: {1}, {2}".format( - self.name, code, reason)) - # self.application.ws_clients.remove(self) logger.warning("Removed closed WebSocket client: {0}".format(self)) @@ -143,30 +131,16 @@ class WSHandler(tornado.websocket.WebSocketHandler): if ``success=False``. """ logger.debug("WebSocket: received message: {0}".format(message)) + msg = json_decode(message) try: - msg = json.loads(message) msg_type = msg["type"] - except json.JSONDecodeError: - logger.warning("WebSocket: message is not a valid JSON string") - response = {"success": False, - "type": None, - "error": "message is not a valid JSON string"} except (KeyError, TypeError): logger.warning("WebSocket: skip invalid message") response = {"success": False, "type": None, "error": "type is missing"} else: - # Check the message type and dispatch task - if msg_type == "configs": - # Request or set the configurations - response = self.configs_handler.handle_message(msg) - elif msg_type == "console": - # Control the simulation tasks, or request logging messages - # FIXME/XXX: - # * How to make this asynchronously ?? - response = self.console_handler.handle_message(msg) - elif msg_type == "results": + if msg_type == "results": # Request the simulation results response = self._handle_results(msg) else: @@ -177,7 +151,7 @@ class WSHandler(tornado.websocket.WebSocketHandler): "type": msg_type, "error": "unknown message type %s" % msg_type} # - msg_response = json.dumps(response) + msg_response = json_encode(response) self.write_message(msg_response) def broadcast(self, message): @@ -198,11 +172,11 @@ class WSHandler(tornado.websocket.WebSocketHandler): "action": "push", "data": data, "errors": errors} - message = json.dumps(msg) + message = json_encode(msg) logger.debug("Message of current configurations: {0}".format(message)) self.write_message(message) logger.info("WebSocket: Pushed current configurations data " + - "and validation errors to the client") + "with validation errors to the client") def _handle_results(self, msg): # Got a message of supported types |