带有异步处理程序的Websocket

时间:2016-02-08 16:10:53

标签: akka akka-http

我无法让Akka http websockets与connection.handleWithAsyncHandler一起使用。这是我在scala中的代码(我使用的是最新版本的akka​​ http)

import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.HttpMethods._
import akka.http.scaladsl.model._
import akka.http.scaladsl.model.ws.{Message, UpgradeToWebsocket}
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Flow, Sink}

import scala.concurrent.Future

object Server extends App {
    implicit val system = ActorSystem("server-system")
    implicit val materializer = ActorMaterializer()
    implicit val dispatcher = system.dispatcher
    implicit val formats = net.liftweb.json.DefaultFormats

    val serverSource = Http().bind(interface = "localhost", port = 9000)

    val requestHandler: HttpRequest => Future[HttpResponse] = {
        case request @ HttpRequest(GET, Uri.Path("/websocket"), _, _, _) => {
            Future {
                request.header[UpgradeToWebsocket] match {
                    case Some(upgrade) => {
                        upgrade.handleMessages(Flow[Message])
                    }
                    case None => {
                        HttpResponse(StatusCodes.BadRequest)
                    }
                }
            }
        }
        case _: HttpRequest => {
            Future.successful(HttpResponse(StatusCodes.BadRequest))
        }
    }

    val bindingFuture = serverSource.to(Sink.foreach { connection =>
        connection.handleWithAsyncHandler(requestHandler)
    }).run()
}

和我的JS代码来测试它:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<script>
    var ws = new WebSocket('ws://localhost:9000/websocket');

    ws.onopen = function() {
        console.log('open');

        ws.send('test message');
    };

    ws.onmessage = function(msg) {
        console.log(msg.data);
    };

    ws.onclose = function() {
        console.log('close');
    };
</script>
</body>
</html>

在控制台中我得到了

open
close

为什么在打开后直接关闭websocket连接?

1 个答案:

答案 0 :(得分:1)

更新到akka 2.4.2-RC2就可以了。