我想跟踪多个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,我应该使用它们。
感谢您的帮助。
答案 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()
而不是列表,它会更好一些。使用集而不是列表,使用add
和discard
代替append
和remove
。