首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Tornado中保留websocket连接列表[副本]

在Tornado中保留websocket连接列表[副本]
EN

Stack Overflow用户
提问于 2014-02-21 16:40:18
回答 1查看 2.5K关注 0票数 3

这个问题在这里已经有答案了:

Tornado:识别/跟踪websockets的连接?

(4个答案)七年前就关门了。

为了跟踪多个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,我应该使用它们。

谢谢你的帮助。

EN

Stack Overflow用户

回答已采纳

发布于 2014-02-21 21:43:04

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

# 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

顺便说一下,如果您使用Pythonset()这样会更好一些,而不是为每组处理程序都列出一个列表。使用集合而不是列表,使用adddiscard而不是appendremove

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21929315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档