你需要保留已打开的WebSocket集合,并随时遍历该集合发送消息。
例如,每当客户端连接到
your.domain.example/test/
时,我会发送一条消息,但是在你想要发送任何内容时,思路都是相同的。
import os.path
import logging
from tornado import ioloop, web, websocket
SERVER_FOLDER = os.path.abspath(os.path.dirname(__file__))
LOGGER = logging.getLogger('tornado.application')
class TestHandler(web.RequestHandler):
def get(self):
server = ioloop.IOLoop.current()
data = "whatever"
server.add_callback(DefaultWebSocket.send_message, data)
self.set_status(200)
self.finish()
class DefaultWebSocket(websocket.WebSocketHandler):
live_web_sockets = set()
def open(self):
LOGGER.debug("WebSocket opened")
self.set_nodelay(True)
self.live_web_sockets.add(self)
self.write_message("you've been connected. Congratz.")
def on_message(self, message):
LOGGER.debug('Message incomming: %s', message)
def on_close(self):
LOGGER.debug("WebSocket closed")
@classmethod
def send_message(cls, message):
removable = set()
for ws in cls.live_web_sockets:
if not ws.ws_connection or not ws.ws_connection.stream.socket:
removable.add(ws)
else:
ws.write_message(message)
for ws in removable:
cls.live_web_sockets.remove(ws)
def serve_forever(port=80, address=''):
application = web.Application([
(r"/test/", TestHandler),
(r"/websocket/", DefaultWebSocket),
...
],
static_path=os.path.join(SERVER_FOLDER, ...),
debug=True,
)
application.listen(port, address)
LOGGER.debug(
'Server listening at http://%s:%d/',
address or 'localhost', port)
ioloop.IOLoop.current().start()
if __name__ == "__main__":
serve_forever()
你显然需要使用以下JavaScript在浏览器中创建一个websocket:
socket = new WebSocket('ws://your.domain.example:80/websocket/');
并相应地进行管理。
self
保存到全局变量中。我在想是否有更好的方法来完成这个操作。 - Collin Bell@classmethod
;) - 301_Moved_Permanently