我有一个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
的响应时执行更多代码?
答案 0 :(得分:1)
Play不支持WebSocket客户端连接。最好的选择可能是使用AsyncHttpClient
,这是构建Play的WS API的库,因此它已经在您的类路径上,使用它访问WebSockets的说明如下: