在没有请求的情况下将消息推送到websocket客户端

时间:2014-09-21 18:51:35

标签: scala playframework websocket

我正在制作Play网络套接字应用。当客户端连接时,我想发送一条欢迎消息。 我使用的代码如下:

package controllers

import play.api._
import play.api.mvc._
import play.api.libs.iteratee.Concurrent
import play.api.libs.iteratee.Iteratee
import play.api.libs.concurrent.Execution.Implicits.defaultContext

object Test extends Controller {
  def index = WebSocket.using[String] { _ => 
    val (out,channel) = Concurrent.broadcast[String]          
    channel.push("Welcome to MyWebSocket")
    val in = Iteratee.foreach[String] {
      _ match {
        case any => channel.push(any)
      }
    }
    (in, out)
  }
}

当客户端发送消息并且服务器必须响应它时,代码工作正常。但是,不会发送初始欢迎消息Welcome to MyWebSocket。我该如何修复此代码?

[编辑]

我有点想出了问题,但还没有找到解决方案。可能会出现此问题,因为在推送欢迎消息时尚未初始化websocket。我修改了代码并替换了:

channel.push("Welcome to MyWebSocket")

val a = scala.concurrent.Future {
  Thread.sleep(1000)
  channel.push("Welcome to MyWebSocket")
}

在此之后,我得到了预期的结果(客户收到的欢迎信息)。我认为使用上述方法(Thread.sleepFuture)不是解决此问题的正确方法,因此欢迎使用其他解决方案。它也可能是客户端代码的问题,需要一段时间来初始化套接字。我使用Firefox和echo web-socket test作为客户端。

1 个答案:

答案 0 :(得分:0)

您可以使用WebSocket.acceptWithActor帮助方法(have a look at this)并在actor主体中创建类似

的内容
out ! "Welcome to MyWebSocket"

效果很好。