这个问题在这里已经有答案了:
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,我应该使用它们。
谢谢你的帮助。
发布于 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()
这样会更好一些,而不是为每组处理程序都列出一个列表。使用集合而不是列表,使用add
和discard
而不是append
和remove
。
https://stackoverflow.com/questions/21929315
复制相似问题