【发布时间】: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 对象向所有对象发送消息。但是,如果您需要两者都做呢,这取决于具体情况?
- 您是否应该保留
Set的ActorRef对象,例如在Tornado 中?这似乎是最不明智的做事方式。 - 还是应该使用两个 websocket,一个用于单独响应消息,一个用于在一个操作中向所有客户端广播消息?
如果正确的解决方案是第二个,我猜游戏需要为此打开两个 websocket。
【问题讨论】: