使用Play 2.3 Websocket的私人聊天应用程序

时间:2014-07-02 09:52:54

标签: scala websocket iterate playframework-2.3

我正在使用WebSockets处理聊天应用程序(在Play 2.3中使用scala)。必须根据传入消息将消息广播给所有用户或特定用户组。一个用户可以参与多个群组聊天,并且可以同时与个人聊天。

Concurrent.broadcast[JsValue]返回元组(enumerator, channel)。我不知道如何将过滤器应用于此通道,因此只有特定的客户端组才能收到消息。

我们可以在枚举器上应用过滤器 (枚举器&> 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个用户)。谢谢。

1 个答案:

答案 0 :(得分:2)

是的,你可以用演员来处理它,我甚至更愿意,因为你会有某种可变状态(特定房间的用户列表或类似的东西)。

基本上,每个附加的websocket都会有一个actor,你可以看到该actor代表一个用户并让它与其他actor交互。你可以让它注册一个代表聊天室的演员,然后让那个房间的消息发送给所有注册的参与者。

每个actor本身占用的内存非常少,因此您的应用程序是否能够处理超过1000个用户更多的是关于用例的其余部分,发送的消息数量,消息的大小等等。 / p>

docs中有一些带有websockets + actors的代码示例:http://www.playframework.com/documentation/2.3.x/ScalaWebSockets