【问题标题】: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
      }
    
    }
    

    【讨论】:

    • 好吧,我需要为用户写一个演员吗?
    • 你需要两个:用户的演员和房间的演员
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多