播放框架2.2单个websocket消息调度

时间:2013-10-23 08:38:10

标签: scala concurrency websocket playframework-2.0

在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的websockets之间发送私信?

2 个答案:

答案 0 :(得分:1)

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

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)

因此,如果该类型是" talk"那么该消息将被传递给枚举器。 (我们只想过滤消息),收件人是"所有",收件人是用户名本身,或者如果用户是用户名本身,那么发送邮件的人也会看到该邮件。

答案 1 :(得分:0)

聊天室应用程序中的回复通过以下方式发送给会议室中的所有用户:

//向所有成员发送Json事件     public void notifyAll(String kind,String user,String text){

因此,如果您希望实现私人消息,则必须实施“notify”方法,该方法仅向一个特定用户发送消息。说出类似的话:

// 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);
    }