【发布时间】:2016-02-03 17:57:33
【问题描述】:
我有一个 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 解析器异常。
更新:我在ws://0.0.0.0:9000/testSocket 中的WebSocket 连接位于不同项目的scala 控制器内,如下所示:
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.sendMessage("test".getBytes()) 调用WebSocket 连接,它在覆盖方法onMessage() 中为我们提供WebSocket 的响应。我想知道,我们如何才能等待收到WebSocket 响应,以便我们可以使用WebSocket 响应数据执行所需的计算。我通过在onMessage() 方法中返回一个Future[JsValue] 变量进行了检查,但那是无效的。那么我们如何将webSocket.sendMessage("test".getBytes()) 置于等待模式,以便在WebSocket 的响应后执行进一步的代码?
【问题讨论】:
标签: scala playframework websocket playframework-2.4