Python Tornado:识别/跟踪WebSocket的连接?
我有一个基本的Tornado websocket测试:Python Tornado:识别/跟踪WebSocket的连接?,python,websocket,tornado,Python,Websocket,Tornado,我有一个基本的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_messag
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密钥的唯一性有多可靠 最简单的方法就是保留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\u origin(self,origin)
可能会有所帮助。例如:
clients = {}
class WSHandler(tornado.websocket.WebSocketHandler):
def check_origin(self, origin):
clients[origin] = self
print(clients)
return True
据我所知,每个连接都将创建一个WSHandler实例。因此,WSHandler基本上只是连接接口。也许你想在网络上添加一些消息处理引擎,例如?Cole的回答符合我的需要,但如果我确实需要WSHandler本身之外的更多控制,我会记住你的回答。谢谢你的帮助@Nikolay,非常好的回答Nikolay,非常好的主意是跟踪用户而不让他们发送他们是谁,你可以很容易地识别他们并发送消息/相应地关闭连接。。。干得好:))。通常这类信息的存储都是用Redis完成的。这绝对是处理这种情况的可靠方法。我真的可以像memcached一样将handler对象存储在外部缓存中吗?我认为对象本身可以序列化,但它和连接关联,我不确定是否会丢失…如果我有多个tornado服务器怎么办?如何在它们和客户端(浏览器)之间进行通信?
如果您想识别连接(例如按用户),可能必须通过套接字发送该信息。
。我不明白你的意思?如何识别用户的连接?一种方法(例如)是通过套接字发送会话id,在消息上的中处理它,并将其存储在WSHandler
实例(或任何地方)。@colemaclin回答得好!但是,如果在一个有多个用户的系统中,我想发送从一个websocket客户端(browser1)接收的数据,该客户端也更新了一个数据库,然后将该数据传递给另一个客户端(browser2)?@direwolf7您需要处理所有这些(或者最好调用其他有此功能的客户端)在on_message
中,我认为在这里使用集合而不是列表更合适,以避免重复。