![](/img/trans.png)
[英]Inspecting HTTPS connections in Tornado (Python) to identify slowness
[英]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.