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



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

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

可以在枚举数上应用过滤器,如(enumerator &>被枚举者。过滤器(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是如何工作的。

我想知道是否有使用演员做同样的另一种方式。我还想知道,这个设计将处理更高的负载(超过1000个用户)。谢谢你。

是的,你可以用actor来处理它,我甚至更喜欢这样,因为你会有某种可变状态(在特定房间的用户列表或类似的东西)。

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

每个actor本身占用很少的内存,所以你的应用程序是否能够处理超过1000个用户更多的是关于你的用例的其余部分,发送了多少消息,消息有多大等。

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

相关内容

  • 没有找到相关文章

最新更新