現在 Play WebSocket メッセージを処理しているクライアントにプライベート応答を送信する必要がありますが、他のメッセージについては、すべてのクライアントに応答をブロードキャストする必要があります。
Play チャットの例では、着信メッセージはただちに 1 つの Actor にオフロードされます。
case Connected(enumerator) =>
// Create an Iteratee to consume the feed, assuming all requests have
// a JSON "text" node, and delegate all to the Akka Actor:
val iteratee = Iteratee.foreach[JsValue] { event =>
default ! Talk(username, (event \ "text").as[String])
}.map { _ =>
default ! Quit(username)
}
(iteratee,enumerator)
上記では、接続が承認されると、同じアクタによって既に作成されenumerator
た単一のものが参照されます。chatEnumerator
val (chatEnumerator, chatChannel) = Concurrent.broadcast[JsValue]
これでは、1 つのクライアントだけにメッセージを送信することはできないと思いますか? ブロードキャスト機能を削除し、各クライアントの列挙子を作成して追跡し、自分自身を反復する必要がありますか? または、どうにかしてクライアント固有の列挙子への参照を取得できますforeach
か?
(組み込みの柔軟性は実装に依存することを理解していますが、このユースケースは私には非常に一般的なようです。Socket.IOで WebSockets を使用する場合と同様に、すべてのクライアント、現在の送信者を除くすべてのクライアントにメッセージを簡単に送信できますリクエスト、または単一のクライアント.これは、私が Play 2.1.x でも達成しようとしていることです。)