Python Tornado向所有连接发送消息

11

我有一个用于 WebSocket 服务器的简单代码:

import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web
import time

class WSHandler(tornado.websocket.WebSocketHandler):

  def open(self):
    print 'New connection was opened'
    self.write_message("Conn!")

  def on_message(self, message):
    print 'Got :', message
    self.write_message("Received: " + message)


  def on_close(self):
    print 'Conn closed...'


application = tornado.web.Application([
  (r'/ws', WSHandler),
])

if __name__ == "__main__":
  http_server = tornado.httpserver.HTTPServer(application)
  http_server.listen(65)
  tornado.ioloop.IOLoop.instance().start()

我希望能够向所有已连接的客户端发送消息,但我不知道如何做到,也似乎找不到相关信息。请提供一点帮助好吗?谢谢。

1个回答

13

首先,您应该手动开始管理传入的连接,这是因为Tornado默认不会进行此操作。作为一种天真的实现方式,您可以像这样操作:

class WSHandler(tornado.websocket.WebSocketHandler):
  connections = set()

  def open(self):
     self.connections.add(self)
     print 'New connection was opened'
     self.write_message("Conn!")

  def on_message(self, message):
     print 'Got :', message
     self.write_message("Received: " + message)


  def on_close(self):
     self.connections.remove(self)
     print 'Conn closed...'

所以,如果您希望将相同的消息发送给所有连接,可以这样做:

 [con.write_message('Hi!') for con in connections]

3
我遇到了这段代码的错误。正确的写法是: [con.write_message('你好!') for con in self.connections] - James
1
我让我的客户端在一个循环中持续监听服务器,就像 tornadoweb.org/en/stable/websocket.html#client-side-support 中所提到的那样。但是,我无法通过使用列表的上述过程来使多个客户端实例连接到服务器。第二个客户端总是等待第一个客户端进程结束,然后我才能从服务器读取消息。有没有什么解决方法?我正在使用与上述允许多个连接相同的模型。 - readytotaste
@Denis,与其持有一组连接(set()),并使用更多的内存 - Tornado 内部难道不已经持有这样的数据结构了吗? - Nathan B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接