[英]Response from Server Scala with Play
我正在用Scala和Play做我的第一个应用程序! 我在哪里使用WebSocket就像在聊天室示例中一样,到目前为止,我可以将消息发送到服务器,但是我似乎不明白在哪里可以“处理”从客户端获得的消息,我也想知道我是否可以将Json Arrays从服务器发送到客户端:
@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函数从客户端发送消息。
编辑我要处理此消息的方式是将它们作为参数传递给函数,该函数将返回要返回给客户端的字符串或整数数组
您需要做的就是在源和接收器之间添加一个流程阶段,该流程阶段可以存储在数据库中,并向客户端返回一些其他消息。
解决上述问题的方法如下:
使用此处收到的消息来做您想做的任何事情。
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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.