Tornado: ¿Identificar / rastrear conexiones de websockets?

Tengo una prueba básica de websocket Tornado:

import tornado.httpserver import tornado.websocket import tornado.ioloop import tornado.web class WSHandler(tornado.websocket.WebSocketHandler): def open(self): print 'new connection' self.write_message("Hello World") def on_message(self, message): print 'message received %s' % message def on_close(self): print 'connection closed' application = tornado.web.Application([ (r'/ws', WSHandler), ]) if __name__ == "__main__": http_server = tornado.httpserver.HTTPServer(application) http_server.listen(8888) tornado.ioloop.IOLoop.instance().start() 

Quiero poder manejar múltiples conexiones (lo que parece que ya lo hace) pero también poder hacer referencia a otras conexiones. No veo una manera de identificar y hacer un seguimiento de las conexiones individuales, solo para poder manejar los eventos en la conexión abierta, la recepción de mensajes y la conexión cerrada.

[Editar]
¿Pensar en crear un dictado donde la clave es la clave Sec-websocket-key y el valor es el objeto WSHandler … pensamientos? No estoy seguro de cuán confiable es Sec-websocket-key para ser único.

El método más simple es mantener una lista o dictado de instancias de WSHandler:

 class WSHandler(tornado.websocket.WebSocketHandler): clients = [] def open(self): self.clients.append(self) print 'new connection' self.write_message("Hello World") def on_message(self, message): print 'message received %s' % message def on_close(self): self.clients.remove(self) print 'closed connection' 

Si desea identificar las conexiones, por ejemplo, por usuario, probablemente tendrá que enviar esa información a través del socket.

Cole Maclean asnwer es una buena solución simple cuando solo necesita una lista de todas las conexiones. Sin embargo, si desea algo más complejo, se puede monitorear fuera de la instancia de WSHandler valiente y hágalo de la siguiente manera:

 class WSHandler(tornado.websocket.WebSocketHandler): def open(self): self.id = uuid.uuid4() external_storage[self.id] = {'id':self.id} print 'new connection' self.write_message("Hello World") def on_message(self, message): #Some message parsing here if message.type == 'set_group': external_storage[self.id]['group'] = message.group print 'message received %s' % message def on_close(self): external_storage.remove(self.id) print 'closed connection' 

Si sus usuarios tienen un token de acceso, esto se puede agregar a su punto final de websocket, por ejemplo, y se puede recuperar al inicializar su socket incluso antes de que se abra (pero trabaje sobre SSL).

Si un token de acceso no está disponible, ya sea porque el usuario no ha suministrado uno o el token que suministró ha caducado, el usuario no está autenticado y usted eliminará el socket lo antes posible.

Sin embargo, al hacer esto, el token de acceso debe estar asociado a un usuario que tendrá un identificador y ese identificador se puede vincular al socket incluso antes de que se haya abierto. El identificador puede servir como una clave de diccionario cuyo valor es un conjunto de sockets atados a este usuario.

He resuelto este problema comprobando el origen de la conexión. Por lo tanto, anular el método def check_origin(self, origin) puede ayudar. Por ejemplo:

 clients = {} class WSHandler(tornado.websocket.WebSocketHandler): def check_origin(self, origin): clients[origin] = self print(clients) return True