在Scala控制器中实现WebSocketClient

时间:2016-02-03 17:57:33

标签: scala playframework websocket playframework-2.4

我有一个scala控制器,我使用Play的WS api调用外部Web服务!返回json的框架。现在使用WebSocketClient调用相同的api,因为每个连接都应使用WebSocket而不是http进行。因此,控制器中的正常Action将转换为WebSocket函数,但是我无法从scala代码中调用WebSocket函数。我已经在网上搜索并经历了几个地方的解决方案,但我没有在任何地方找到解决方案。如何做到这一点,调用WebSocket函数并使用scala代码中的WebSocketClient获取其json,或者我们可以说,在scala代码中使用WebSocket?我在SO上找到了类似于我的问题,但没有人给出答案!我想知道它是否可以在Play框架中使用?

Consume a WebSocket connection using Scala and Play

编辑:我正在实现以下代码:

val c = new AsyncHttpClient()
val webSocketClient = c.prepareGet("ws://0.0.0.0:9000/testSocket").execute(new WebSocketUpgradeHandler.Builder().addWebSocketListener(new WebSocketTextListener {

  override def onMessage(s: String): Unit = {
  }

  override def onOpen(webSocket: websocket.WebSocket): Unit = {
    webSocket.sendTextMessage("test")
  }

  override def onFragment(s: String, b: Boolean): Unit = {}

  override def onError(throwable: Throwable): Unit = {}

  override def onClose(webSocket: websocket.WebSocket): Unit = {
    latch.countDown()
  }
}).build()).get()

val result = webSocketClient.sendTextMessage("true")
println("================================" + result)

result变量未打印在控制台上,给出了json解析器异常。

更新:位于不同项目的scala控制器内的WebSocket中的ws://0.0.0.0:9000/testSocket连接如下:

def sockeTest = WebSocket.tryAccept[JsValue] { request =>
  futureJsonVariable.map { json =>
    val in = Iteratee.ignore[JsValue]
    // Some database computation here which generated a Future[JsValue] value in futureJsonVariable variable.
    val out = Enumerator(json).andThen(Enumerator.eof)
    Right((in, out))
  } recover {
    case err => Left(InternalServerError(err.getMessage))
  }
}

Update2:关于这一点,我想问的最后一点是,我们使用WebSocket调用webSocket.sendMessage("test".getBytes())连接,它在重写方法{WebSocket中给出了响应onMessage() 1}}。我想知道,我们如何等待收到WebSocket响应,以便我们可以使用WebSocket响应数据执行所需的计算。我已通过在Future[JsValue]方法中返回onMessage()变量进行了检查,但该内容无效。那么我们如何才能将webSocket.sendMessage("test".getBytes())置于等待模式,以便在WebSocket的响应时执行更多代码?

1 个答案:

答案 0 :(得分:1)

Play不支持WebSocket客户端连接。最好的选择可能是使用AsyncHttpClient,这是构建Play的WS API的库,因此它已经在您的类路径上,使用它访问WebSockets的说明如下:

https://github.com/AsyncHttpClient/async-http-client