簡體   English   中英

Play Framework 2.2單個WebSocket消息調度

[英]Play framework 2.2 single websocket messages dispatching

在播放框架中,我們可以看到websocket-chat應用程序,該應用程序向我們展示了如何使用Concurrent.broadcast處理websocket消息。

但是我想使用websocket將消息分別發送到每個連接的websocket。 最簡單的示例是類似於私人消息,當用戶發送消息時,例如:{用戶:“第一”,發給:“第二”,消息:“嗨”}。

我查看了對象play.api.libs.iteratee.Concurrent,看起來最合適的方法是使用Concurrent.unicast來執行此操作。 但是當我們有Concurrent.broadcast時-我們有可以推送消息的渠道。 在Concurrent.unicast的情況下-我們只有枚舉數。

那么,如何在Scala中使用Play Framework 2.2在WebSocket之間分配私人消息?

我找到了另一種從播放框架示例的源代碼中存檔私人消息傳遞問題的方法。 通過為每個用戶使用篩選的枚舉數:

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)

因此,如果消息的類型是“對話”(我們只想過濾消息),接收者是“全部”,接收者是用戶名本身,或者如果用戶是用戶名本身,則消息將傳遞給枚舉器,以便此人發送消息中還會看到該消息。

聊天室應用程序中的回復將通過以下方式發送給會議室中的所有用戶:

//將Json事件發送給所有成員public void notifyAll(String kind,String user,String text){

因此,如果您想實現私人消息,則必須實現“通知”方法,該方法僅將消息發送給一個特定用戶。 像這樣說:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM