在 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() 而不是每组处理程序的列表,它会好一点。对于集合而不是列表,请使用 adddiscard 而不是 appendremove

【讨论】:

非常感谢!我现在意识到的主要问题是列表的使用。由于它们允许重复,我需要代码来检查每个操作的重复项,这就是我可以看到的添加位置。 set() 解决了这个问题并涵盖了我需要的一切。谢谢! 简短而简单。谢谢!

以上是关于在 Tornado 中保留 websocket 连接列表 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

握手问题 Tornado 服务器和 ESP32 客户端

[Python][Tornado] 是不是可以在一个 python 程序中拥有多个不同端口和消息的 websocket?

Django、websockets、Tornado,如何让它们通信?

tornado websocket

websocket[tornado] 的单个实例可以处理不同的请求吗?

如何在 Tornado 中创建多个 websocket 聊天?