我正在使用 WebSockets 开发一个聊天应用程序(在带有 scala 的 Play 2.3 中)。必须根据传入消息将消息广播给所有用户或特定用户组。一个用户可以参与多个群聊,并且能够同时与个人聊天。
Concurrent.broadcast[JsValue]
返回元组(enumerator, channel)
。我不知道如何对这个频道应用过滤器,所以只有特定的客户组会收到消息。
我们可以在枚举器上应用过滤器,例如 (enumerator &> Enumeratee.filter[JsValue] {...} )。但是我们不能通过这个枚举器推送消息。
我不想在客户端解析消息。我的代码看起来像这样,
val (public_enumerator, public_channel) = Concurrent.broadcast[JsValue]
def chat = WebSocket.using[JsValue] { request =>
val in = Iteratee.foreach[JsValue]{ msg =>
public_channel.push(msg)
}.map { _ =>
// Quit connection
}
(in ,public_enumerator)
}
我在网上找到的大多数示例都使用了已弃用的方法,其中一些在 Play 2.3 中被删除(如 Enumerators.imperative)。我不知道如何Concurrent.unicast
工作。
我想知道是否有另一种使用 Actors 的方法来做同样的事情。我也想知道,这种设计将处理更高的负载(超过 1000 个用户)。谢谢你。