我需要向当前正在处理 Play WebSocket 消息的客户端发送私人响应,而对于其他消息,我需要向所有客户端广播响应。
在 Play 聊天示例中,传入的消息会立即卸载到单个 Actor:
case Connected(enumerator) =>
// Create an Iteratee to consume the feed, assuming all requests have
// a JSON "text" node, and delegate all to the Akka Actor:
val iteratee = Iteratee.foreach[JsValue] { event =>
default ! Talk(username, (event \ "text").as[String])
}.map { _ =>
default ! Quit(username)
}
(iteratee,enumerator)
上面,一旦连接被批准enumerator
,就会传回,这指的chatEnumerator
是同一个 Actor 已经创建的单曲:
val (chatEnumerator, chatChannel) = Concurrent.broadcast[JsValue]
我认为这不允许我向单个客户发送消息?我应该删除广播功能并为每个客户端创建和跟踪枚举器,然后自己迭代吗?或者我可以以某种方式获得对特定于客户端的枚举器的引用foreach
吗?
(我知道内置的灵活性取决于实现,但是这个用例对我来说似乎很常见。就像使用带有Socket.IO的 WebSockets 时,我可以轻松地将消息发送到所有客户端,除了当前的发送者之外的所有客户端请求,或者只是一个客户端。这也是我在 Play 2.1.x 中想要实现的。)