1

在 play 框架中,我们可以看到 websocket-chat 应用程序,它向我们展示了 Concurrent.broadcast 用于处理 websocket 消息的用法。

但我想使用 websockets 独立地向每个连接的 websocket 发送消息。最简单的例子是私人消息,当用户发送如下消息时:{user:“First”,to:“Second”,message:“Hi”}。

我查看了对象 play.api.libs.iteratee.Concurrent,看起来最适合有 Concurrent.unicast 来执行此操作。但是当我们有 Concurrent.broadcast - 我们有可以推送消息的频道。在 Concurrent.unicast 的情况下 - 我们只有 Enumerator。

那么,如何在 Scala 中使用 Play Framework 2.2 在 websocket 之间发送私人消息?

4

2 回答 2

1

我从播放框架示例的源代码中找到了另一种将私人消息传递问题归档的方法。通过为每个用户使用过滤的枚举器:

val filteredEnumerator = enumerator &> Enumeratee.filter[JsValue]( e =>  {
    if ( (e \ "kind").as[String] == "talk") {
      val isToAll = (e \ "recipient").as[String] == "all"
      val isToRecipient = (e \ "recipient").as[String] == username
      val isFromRecipient = (e \ "user").as[String] == username
      isToAll || isToRecipient || isFromRecipient
    } else {
      true
    }
  })
  sender ! Connected(filteredEnumerator)

因此,如果类型是“谈话”(我们只想过滤消息),接收者是“全部”,接收者是用户名本身,或者如果用户是用户名本身,那么消息将被传递给枚举器,所以发送的人message 也看到了消息。

于 2014-03-29T16:53:29.937 回答
0

the reply in the Chat room application is sent to All users in the Room via:

// Send a Json event to all members public void notifyAll(String kind, String user, String text) {

So if you would like to implement a private message then you will have to implement "notify" method that will send message only to one specific user. Say something like:

// Send a Json event to all members
public void notify(String kind, String user, String userTo, String text) {
    for(WebSocket.Out<JsonNode> channel: members.values()) {

        ObjectNode event = Json.newObject();
        event.put("kind", kind);
        event.put("user", user);
        event.put("message", text);

        ArrayNode m = event.putArray("members");
        m.add(userTo);

        channel.write(event);
    }
于 2013-10-23T10:48:07.047 回答