2016-12-25 34 views
1

我也跟着在https://www.playframework.com/documentation/2.5.x/ScalaWebSockets如何创建在游戏框架2.5.X多个用户使用的WebSocket

的文件我写了一个聊天室,与男主角:

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的聊天室?

回答

1

您需要用演员为您的系统建模。 MyWebSocketActor代表单个用户。你需要演员,代表与用户的房间。

我写简单的例子(说明中注释):

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 
    } 

} 
+0

好,还要我写用户的演员? –

+0

你需要两个:演员为用户和演员的房间 – zella