使用Scala和Play消耗WebSocket连接

时间:2014-09-19 08:29:22

标签: scala playframework websocket playframework-2.0

我正在寻找一种在Scala中使用websocket的方法。

websocket是在Play应用程序中创建的。

中的代码

控制器

def socket = WebSocket.acceptWithActor[String, JsValue] { request => out =>
  WebsocketActor.props(out)
}

路由

# Sockets
GET     /socket                          controllers.MyController.socket

使用Javascript连接到套接字工作正常。 现在我想使用http-Client连接到套接字。目前我使用PlayHttpClient

客户sbt dependecy

"com.typesafe.play" %% "play-ws" % "2.3.4"

使用Websocket的代码

我在客户端上找到了几种方法可以解决这个问题,但我遗失了哪一种方法以及如何使用它们:

https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.libs.ws.WSRequestHolder

def get[A](consumer: (WSResponseHeaders) ⇒ Iteratee[Array[Byte], A])(implicit ec: ExecutionContext): Future[Iteratee[Array[Byte], A]]

看起来它可以做到这一点。但是如何实施消费者?

def getStream(): Future[(WSResponseHeaders, Enumerator[Array[Byte]])]

// Thats how I used it
  def alertStream = client.
    url(http://localhost:9000/socket).
    withHeaders("Accept" -> "application/json").
    stream.map { case (headers, enumerator) =>
      println(headers)

      val loggingIteratee = Iteratee.foreach[Array[Byte]] { chunk =>
        val chunkString = new String(chunk, "UTF-8")
        println(chunkString)
      }

     enumerator.apply( loggingIteratee )

loggingIteratee.run

}

我尝试过这个,但我总是在ResponseHeaders中获得400 - Excpetion。将协议更改为URL中的ws://会导致此异常:

> val con = client.url("ws://localhost:9000/socket").get
java.io.IOException: WebSocket method must be a GET
at    com.ning.http.client.providers.netty.NettyAsyncHttpProvider.doConnect(NettyAsyncHttpProvider.java:989) 

0 个答案:

没有答案