Подтвердить что ты не робот

Торнадо: Определить/отслеживать соединения веб-карт?

У меня есть базовый тест 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()

Я хочу иметь возможность обрабатывать несколько подключений (которые, как представляется, уже есть), а также иметь возможность ссылаться на другие соединения. Я не вижу способа идентифицировать и отслеживать отдельные подключения, просто чтобы иметь возможность обрабатывать события при открытии соединения, получении сообщений и закрытии соединения.

[Изменить]
Мысль о создании dict, где ключ является ключ Sec-websocket, а значение - объект WSHandler... мысли? Я не уверен, насколько надежный ключ Sec-websocket должен быть уникальным.

4b9b3361

Ответ 1

Самый простой способ - просто сохранить список или dict экземпляров 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'

Если вы хотите идентифицировать соединения, например. вам, вероятно, придется отправить эту информацию через сокет.

Ответ 2

Cole Maclean asnwer - это простое решение, когда вам просто нужен список всех подключений. Однако, если вам нужно что-то более сложное, которое можно контролировать вне экземпляра WSHandler - будьте смелым, сделайте это так:

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'

Ответ 3

Если у ваших пользователей есть токен доступа, это может быть добавлено к вашей конечной точке websocket, скажем, и извлечено при инициализации вашего сокета еще до его открытия (но, пожалуйста, работайте над SSL).

Если токен доступа недоступен, так как пользователь не предоставил один или токен, который они поставили, истек, пользователь не аутентифицирован, и вы как можно скорее убьете сокет.

Однако вы это делаете, токен доступа должен быть связан с пользователем, у которого будет идентификатор, и этот идентификатор может быть привязан к сокету даже до его открытия. Идентификатор может служить в качестве словарного ключа, значение которого представляет собой набор сокетов, привязанных к этому пользователю.

Ответ 4

Я решил эту проблему, проверив происхождение conexion. Таким образом, переопределение метода def check_origin(self, origin) может помочь. Например:

clients = {}

class WSHandler(tornado.websocket.WebSocketHandler):


    def check_origin(self, origin): 

        clients[origin] = self
        print(clients)
        return True