2017-07-31 14 views
1

私は最初のアプリケーションをScalaとPlayでやっています!私がWebSocketをchatroomの例とまったく同じように使用しているところでは、これまでのところ私は自分のサーバーにメッセージを送ることができますが、私がクライアントから受け取ったメッセージをどこで "処理"できるか分かりません。私は私のクライアントに私のサーバーからJSON配列を送ることができるかどうかを知る:サーバースカラからの応答

@Singleton 
class HomeController @Inject()(cc: ControllerComponents) 
           (implicit actorSystem: ActorSystem, 
           mat: Materializer, 
           executionContext: ExecutionContext) 
           extends AbstractController(cc) { 

    private type WSMessage = String 

    private val logger = Logger(getClass) 

    private implicit val logging = Logging(actorSystem.eventStream, logger.underlyingLogger.getName) 

    // chat room many clients -> merge hub -> broadcasthub -> many clients 
    private val (chatSink, chatSource) = { 
    // Don't log MergeHub$ProducerFailed as error if the client disconnects. 
    // recoverWithRetries -1 is essentially "recoverWith" 
    val source = MergeHub.source[WSMessage] 
     .log("source") 
     .recoverWithRetries(-1, { case _: Exception ⇒ Source.empty }) 

    val sink = BroadcastHub.sink[WSMessage] 
    source.toMat(sink)(Keep.both).run() 
    } 

    private val userFlow: Flow[WSMessage, WSMessage, _] = { 
    Flow.fromSinkAndSource(chatSink, chatSource) 
    } 

    def index: Action[AnyContent] = Action { implicit request: RequestHeader => 
    val webSocketUrl = routes.HomeController.chat().webSocketURL() 
    logger.info(s"index: ") 
    Ok(views.html.index(webSocketUrl)) 
    } 

    def chat(): WebSocket = { 
    WebSocket.acceptOrResult[WSMessage, WSMessage] { 
     case rh if sameOriginCheck(rh) => 
     Future.successful(userFlow).map { flow => 
      Right(flow) 
     }.recover { 
      case e: Exception => 
      val msg = "Cannot create websocket" 
      logger.error(msg, e) 
      val result = InternalServerError(msg) 
      Left(result) 
     } 

     case rejected => 
     logger.error(s"Request ${rejected} failed same origin check") 
     Future.successful { 
      Left(Forbidden("forbidden")) 
     } 
    } 
    } 

} 

はところで私はjqueryの関数を介して私のクライアントからメッセージを送信しています。

編集私はこのメッセージを処理する方法は、関数のパラメータとして渡すことである、機能が必要なの私は、クライアント

答えて

0

に戻りたい文字列または整数の配列を返します。ソースとシンクの間にフローステージを追加して、DBに格納して他のメッセージをクライアントに返すことができます。

は、ここでは、上記の問題を解決することができます方法は次のとおりです。

ドゥあなたがここに受信したメッセージで好き。

val flow = Flow[WSMessage].map { element => 
    println(s"Message: $element") 
    element 
} 

おおよそのデータベースにメッセージを永続化するために、あなたが最も可能性の高い非同期のステージを使用することに注意してください、:

val flow = Flow[WSMessage].mapAsync(parallelism) { element => 
    println(s"Message: $element") 
    // assuming DB.write() returns a Future[Unit] 
    DB.write(element).map(_ => element) 
} 

そして最後に、あなたはストリームパイプラインに流れ、ステージを追加する必要があります。

source.via(flow).toMat(sink)(Keep.both).run() 
関連する問題