【问题标题】:Play websockets: send to one client or many播放 websockets:发送到一个或多个客户端
【发布时间】:2018-04-10 17:34:21
【问题描述】:

我正在尝试使用 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.

一种情况将数据发送回发出请求的套接字,一种情况将数据发送到所有 websocket。但我对这两种情况都使用相同的套接字。

使用 Play,我应该如何处理这种区别?

Websocket 文档网页中的示例展示了如何将消息发送回发送者,聊天示例应用程序展示了如何使用 BroadcastHub.sink 对象向所有对象发送消息。但是,如果您需要两者都做呢,这取决于具体情况?

  • 您是否应该保留SetActorRef 对象,例如在Tornado 中?这似乎是最不明智的做事方式。
  • 还是应该使用两个 websocket,一个用于单独响应消息,一个用于在一个操作中向所有客户端广播消息?

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

【问题讨论】:

    标签: playframework websocket


    【解决方案1】:

    我似乎试图以错误的方式做这件事,而这正是我一直需要的:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      相关资源
      最近更新 更多