播放websockets:发送给一个或多个客户端

时间:2017-10-29 17:53:30

标签: playframework websocket

我正在尝试使用Scala来使用Play框架。

对于小型项目,我的首选框架目前是Tornado。我使用它是因为它使用websockets是多么容易。以下是我在Tornado中使用websocket处理程序的方法:

class SocketHandler(tornado.websocket.WebSocketHandler):
  """
  Handles websocket connections.
  """
  CLIENTS = set()

  def open(self, *args, **kwargs):
    self.CLIENTS.add(self)
    self.send_data() // Perform special "on open" action.

然后,对于每个收到的消息,我都会从websocket类中执行此操作:

def some_action(self, message):
  do_things()
  self.write_message(response_data) # If needed.

如果我需要更新所有客户端的偶数,我会这样做:

new_data = database_callback_that_affects_all_clients()
for client in SocketHandler.CLIENTS:
  try:
    client.write_message(new_data)
  except WebSocketClosedError: pass # You can't always be sure which ones are closed.

一个案例将数据发送回发出请求的套接字,一个案例将数据发送到所有websockets。但我在两种情况下使用相同的套接字。

通过Play,我该如何处理这种区别?

Websocket文档网页中的示例显示了如何将消息发送回发件人,聊天示例应用程序显示了如何使用BroadcastHub.sink对象向所有内容发送消息。但是如果你需要同时做两件事情呢?

  • 你应该保留一个Set ActorRef个物品,就像龙卷风一样?这似乎是玩游戏的最小方式。
  • 或者你应该使用两个websockets,一个用于单独响应消息,一个用于在一个动作中向所有客户端广播消息?

如果正确的解决方案是第二个,我猜这个游戏需要打开两个websockets。

1 个答案:

答案 0 :(得分:0)

我看起来我试图以错误的方式做到这一点,这就是我一直需要的东西:

enter image description here