如何在 Play 中通过网络套接字向 actor 发送消息!框架?

Alg*_*man 5 scala websocket actor akka playframework

这是一个相当基本的问题,但在谷歌搜索几个小时后我找不到令人满意的答案。从这里的例子来看,制作网络套接字的方法是这样的:

控制器代码:

import play.api.mvc._
import play.api.libs.streams.ActorFlow
import javax.inject.Inject
import akka.actor.ActorSystem
import akka.stream.Materializer

class Application @Inject()(cc:ControllerComponents) (implicit system: ActorSystem, mat: Materializer) extends AbstractController(cc) {

  def socket = WebSocket.accept[String, String] { request =>
    ActorFlow.actorRef { out =>
      MyWebSocketActor.props(out)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

演员代码:

import akka.actor._

object MyWebSocketActor {
  def props(out: ActorRef) = Props(new MyWebSocketActor(out))
}

class MyWebSocketActor(out: ActorRef) extends Actor {
  def receive = {
    case msg: String =>
      out ! ("I received your message: " + msg)
  }
}
Run Code Online (Sandbox Code Playgroud)

但是我到底如何通过网络套接字将消息从控制器发送到参与者呢?假设在控制器代码中,我有一个操作代码,用于处理按下按钮时的情况,它将向演员发送一个字符串块。如何从控制器代码将此字符串发送到上面的参与者?

pme*_*pme 0

我可以为您提供一些 Play 中 websocket 的示例。本质上他们使用Flow( akka-streams) 来处理 websocket 连接。

有一个官方的 Play Websocket 示例Lightbend's Websocket example

基于此,我有几个使用 websockets 的项目,例如:

播放 wsocket-scalajs

这是一个示例应用程序,展示了如何使用 Web 套接字将 Play 项目与 Scala.js、Binding.scala 项目集成。

它非常复杂,所以最简单的方法是检查HomeControllerUserParentActorUserActorAdapterActor如何协同工作。

scala 适配器

是一个基于上面示例的框架 - 它还展示了如何注册 websocket 客户端。