【问题标题】:How to create multiple users in play framework 2.5.x with WebSocket如何使用 WebSocket 在 play framework 2.5.x 中创建多个用户
【发布时间】:2016-12-25 11:20:38
【问题描述】:
我关注了https://www.playframework.com/documentation/2.5.x/ScalaWebSockets的文档
我和演员写了一个聊天室:
def socket = WebSocket.acceptOrResult[String, String] { request =>
ActorFlow.actorRef(out => MyWebSocketActor.props(out))
}
import akka.actor._
class MyWebSocketActor(out:ActorRef) extends Actor{
def receive={
case msg:String =>{
out ! ("I received your message:"+msg)
//println(msg)
}
}
}
object MyWebSocketActor{
def props(out:ActorRef)=Props(new MyWebSocketActor(out))
}
但我有一个问题:当两台设备进入我的聊天室时,它们只有自己的话。
如何使用 Akka Streams 和 Actor 创建聊天室?
【问题讨论】:
标签:
scala
playframework
akka
【解决方案1】:
您需要使用演员为您的系统建模。 MyWebSocketActor 代表单个用户。你需要演员,它代表有用户的房间。
我写了一个简单的例子(用 cmets 解释):
object MyWebSocketActor {
case object Init
}
class MyWebSocketActor(out: ActorRef) extends Actor {
//you can pass precreated room in constructor or receive it from message,
//based on your logic
val room: ActorRef = ???
//when actor starts, it register self in room, we send Init
//message, because actors communications should be in `receive`
override def preStart(): Unit = {
self ! Init
}
//initial state, waiting joining in room
def waitingToJoin: Receive = {
case Init => room ! Join(self)
case Joined => context become joined
}
//joined state, process messages from out and room
def joined: Receive = {
case textFromOut: String => room ! Msg(textFromOut)
case msg: Msg => out ! msg.toString
}
//initial state
override def receive: Receive = waitingToJoin
}
object Room {
//request to join
case class Join(user: ActorRef)
//join response
case class Joined(room: ActorRef)
case class Msg(text: String)
}
class Room extends Actor {
//users in room
val users: ListBuffer[ActorRef] = ListBuffer()
override def receive: Receive = {
case msg: Msg =>
//send messages to all users
users.foreach(u => u ! msg)
//join request
case Join(user) =>
context watch user
users += user
user ! Joined(self)
case Terminated(user) =>
users -= user
}
}