簡體   English   中英

龍卷風:識別/跟蹤websockets的連接?

[英]Tornado: Identify / track connections of websockets?

我有一個基本的Tornado websocket測試:

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-key,而值是WSHandler對象......想法? 我不確定Sec-websocket-key的獨特性是多么可靠。

最簡單的方法是保留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'

如果您想識別連接,例如通過用戶,您可能必須通過套接字發送該信息。

當您需要所有連接列表時,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'

如果您的用戶擁有訪問令牌,則可以將其附加到您的websocket端點,比如說,並在啟動套接字之前獲取它(但請通過SSL工作)。

如果訪問令牌不可用,或者因為用戶未提供訪問令牌或者他們提供的令牌已過期,則用戶未經過身份驗證,您將盡早終止該套接字。

但是,執行此操作時,訪問令牌應與具有標識符的用戶相關聯,然后該標識符即使在打開之前也可以綁定到套接字。 標識符可以用作字典鍵,其值是與該用戶綁定的一組套接字。

我通過檢查conexion的起源解決了這個問題。 因此, def check_origin(self, origin)方法def check_origin(self, origin)可能會有所幫助。 例如:

clients = {}

class WSHandler(tornado.websocket.WebSocketHandler):


    def check_origin(self, origin): 

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM