Tôi đang làm việc trên trò chơi mulitplayer đơn giản trong scala mà tôi muốn hiển thị thông qua websockets cho các máy khách JS.Akka HTTP Websocket, cách xác định các kết nối bên trong của diễn viên
Đây là lớp WebsocketServer tôi
class WebsocketServer(actorRef: ActorRef, protocol: Protocol, system: ActorSystem, materializer: ActorMaterializer) extends Directives {
val route = get {
pathEndOrSingleSlash {
handleWebSocketMessages(websocketFlow)
}
}
def websocketFlow: Flow[Message, Message, Any] =
Flow[Message]
.map {
case TextMessage.Strict(textMessage) => protocol.hydrate(textMessage)
}
.via(actorFlow)
.map(event => TextMessage.Strict(protocol.serialize(event)))
def actorFlow : Flow[Protocol.Message, Protocol.Event, Any] = {
val sink =
Flow[Protocol.Message]
.to(Sink.actorRef[Protocol.Message](actorRef, Protocol.CloseConnection()))
val source =
Source.actorRef[Protocol.Event](1, OverflowStrategy.fail)
.mapMaterializedValue(actor => actorRef ! Protocol.OpenConnection(actor))
Flow.fromSinkAndSource(sink, source)
}
}
này được đơn giản hóa mã của nam diễn viên của tôi rằng sẽ nhận được tin nhắn từ máy chủ WebSocket.
class GameActor() extends Actor {
private var connections: List[ActorRef] = List()
override def receive: Receive = {
case message: Protocol.OpenConnection => {
this.connections = message.connection :: this.connections
message.connection ! Protocol.ConnectionEstablished()
}
case message: Protocol.CloseConnection => {
// how can I remove actor from this.connections ?
}
case message: Protocol.DoSomething => {
// how can I identify from which connection this message came in?
}
}
}
Cho đến nay rất tốt, hiện nay tôi có thể đáp ứng với WelcomeMessage đơn giản với một khách hàng tuy nhiên tôi vẫn không biết làm thế nào để: diễn viên
- loại bỏ ra khỏi danh sách các kết nối bất cứ khi nào diễn viên nhận
CloseConnection
thông điệp? - xác định từ đó thông báo kết nối đến với diễn viên?
Tôi đang tìm một loại cơ chế tích hợp và không bao giờ nghĩ về giải pháp đơn giản nhất, cảm ơn! –