【问题标题】:Implementing a WebSocketClient in Scala controller在 Scala 控制器中实现 WebSocketClient
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复,我浏览了您提供的github链接,可以看到代码实现是在java中。将尝试在 scala 中实现与我使用 scala 控制器相同的代码。您的知识库中是否有任何链接参考,其中在 scala 中提供了相同的实现?
    • 我建议你更好地学习 Scala。 Java 代码可以很容易地转换为 Scala 代码。
    • 我尝试从您所说的 github 链接提供的 java 代码中实现 scala 代码。我想知道,当从scala连接WebSocket时我应该如何检索json输出(当我们执行webSocketVar.sendTextMessage("test")时连接了WebSocket?我想知道我应该在覆盖方法onMessage()中写什么,以便获取我正在连接的 WebSocket 方法的 json 响应?我已经在我的问题中更新了我正在实现的代码。
    • @VinitSharma 为什么不直接使用 Java 库? Scala 能够与 Java 互操作。使用经过良好测试的库比自己完成所有这些工作要好。
    • @bash0r,我对 Play 很陌生!框架和 Scala 语言。坦率地说,但我没有明白你想说什么。我只是借助 JamesRoper 给出的 git 链接上提供的 java 代码在 scala 中实现了代码。我是否以错误的方式实现代码?还是我在上面的代码中缺少某些东西?请对此提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2018-06-14
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多