在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之间发送私信?
答案 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);
}