在Tornado中保留websocket连接列表

时间:2014-02-21 08:40:18

标签: python websocket tornado

我想跟踪多个websocket连接,我必须将WebSocket Handler对象存储在列表中。但我有多个处理程序 - 每个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 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'

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,我应该使用它们。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

这取决于您希望使用处理程序,但您可以轻松地在三个列表中访问它们:

# 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