在 Tornado 中保留 websocket 连接列表 [重复]
Posted
技术标签:
【中文标题】在 Tornado 中保留 websocket 连接列表 [重复]【英文标题】:Keeping a list of websocket connections in Tornado [duplicate] 【发布时间】:2014-02-21 08:40:17 【问题描述】:我想跟踪多个 websocket 连接,我必须将 WebSocket 处理程序对象存储在一个列表中。但我有多个处理程序 - 每个 WS URI(端点)一个。假设我的项目有三个端点 - A、B、C
ws://www.example.com/A
ws://www.example.com/B
ws://www.example.com/C
因此,为了处理每一个的连接,我有三个处理程序。所以我很困惑在哪里创建列表来存储稍后使用的处理程序对象。
我在添加列表之前的代码是--
class WSHandlerA(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'
class WSHandlerB(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'
class WSHandlerC(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'/A', WSHandlerA),
(r'/B', WSHandlerB),
(r'/C', WSHandlerC),
])
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8888)
tornado.ioloop.IOLoop.instance().start()
那么我在哪里创建这个列表并确保它对所有创建的对象都是可见的?我也是 python 新手,所以在理解它时遇到了一些麻烦。
我也意识到我可能只使用一个 URI(端点)并将多个命令作为消息本身的一部分发送。但是后来我不想把 WebSocket 变成二进制协议。鉴于我们有 URI,我应该使用它们。
感谢您的帮助。
【问题讨论】:
@Rod Hyde - 如果您看到,这不是 Websocket 问题。它更像是一个python问题。我已经知道如何处理连接,只是不知道如何将它放入 python 中。所以我不同意它是一个重复(标题可能很接近) 【参考方案1】:这取决于你想用处理程序做什么,但你可以很容易地让它们在三个列表中访问:
# Global variables.
a_handlers = []
b_handlers = []
c_handlers = []
WSHandlerA.open()
执行a_handlers.append(self)
,WSHandlerB.open()
执行b_handlers.append(self)
,以此类推。 WSHandlerA.on_close()
是 a_handlers.remove(self)
。
如果你想对所有 A 处理程序做某事:
for handler in a_handlers:
handler.write_message("message on A")
对所有处理程序做某事:
for handler in a_handlers + b_handlers + c_handlers:
# do something....
pass
顺便说一句,如果您使用 Python set()
而不是每组处理程序的列表,它会好一点。对于集合而不是列表,请使用 add
和 discard
而不是 append
和 remove
。
【讨论】:
非常感谢!我现在意识到的主要问题是列表的使用。由于它们允许重复,我需要代码来检查每个操作的重复项,这就是我可以看到的添加位置。 set() 解决了这个问题并涵盖了我需要的一切。谢谢! 简短而简单。谢谢!以上是关于在 Tornado 中保留 websocket 连接列表 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
[Python][Tornado] 是不是可以在一个 python 程序中拥有多个不同端口和消息的 websocket?
Django、websockets、Tornado,如何让它们通信?