Scala与Play Framework 2.3.6:发送消息给所有套接字客户端

Scala与Play Framework 2.3.6:发送消息给所有套接字客户端

问题描述:

我是Scala和Play Framework的新手,所以我正在尝试一下。 我已经成功创建了websocket,但是我希望能够通过简单的POST请求向多个套接字客户端发送消息。Scala与Play Framework 2.3.6:发送消息给所有套接字客户端

举例来说,我有连接到我的插座10个不同的随机浏览器(WS:// .../WebSocket的),我可以自己发送 “POST:HELLO”,以/NewMessage作为。我该如何让这个“HELLO”被发送给10个客户中的每一个?

下面是接收HELLO的控制器。工作正常,并打印 “了:AnyContentAsText(HELLO)”:

def newMessage = Action { implicit request => 
    println("Got: " + request.body) 
    /* add something here to send "request.body" to every socket client */ 
    Ok("Got: " + request.body) 
} 

这是我的简单的 “套接字” 控制器发送 “欢迎” 来连接的客户端:

object Socket extends Controller { 
def txSocket = WebSocket.using[String] { request => 
    // Log events to the console 
    val in = Iteratee.foreach[String](println).map { _ => 
     println("Disconnected") 
    } 

    // Send a single 'Welcome!' message 
    val out = Enumerator("Welcome!") 

    (in, out) 
} 
} 

哪有我,从我的“消息”控制器发送request.body到websocket?

谢谢你的时间!

+0

您是否正在寻找一种使用iteratees或者Akka/Actor的解决方案?请参阅:https://www.playframework.com/documentation/2.3.6/ScalaWebSockets#Handling-WebSockets-with-actors – 2014-11-08 21:21:18

+0

任何解决方案真的! – Morveus 2014-11-09 11:59:51

每个websocket连接都会创建一个新的actor。您需要选择演员并将消息发送给他们。

像这样。

object Application extends Controller { 

     def connect = WebSocket.acceptWithActor[JsValue, JsValue] { request => out => 
     ClientActor.props(out) 
     } 

     def broadcast = Action { _ => 
     system.actorSelection("akka://application/system/websockets/*/handler") ! "msg" 
     Ok 
     } 

     def system = play.api.libs.concurrent.Akka.system(play.api.Play.current) 
    } 
+0

谢谢,我正在尝试此解决方案! – Morveus 2014-11-09 12:00:42

+0

这似乎是我在找的东西。我无法将消息发送给客户端(他们从来没有收到),但我会弄清楚。再一次感谢你 ! – Morveus 2014-11-09 12:58:40