akka - 带有异步处理程序的 Websocket

标签 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连接打开后直接关闭?

最佳答案

更新到 akka 2.4.2-RC2 成功了。

关于akka - 带有异步处理程序的 Websocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35274125/

相关文章:

java - Akka-http Java API 示例代码/文档

scala - 如何使用 akka 的 http 客户端设置最大内容长度?

docker - 无法从外部访问 Docker 容器中的应用程序

websocket - Kafka 消息到 websocket

apache-spark - Flink 或 Sparks vs Akka 流中的非阻塞操作

scala - 如何使用 akka http 将 html、css 和 js 合二为一?

java - 如何在 Java Play Framework 中记录请求和响应

c# - Akka.Net 远程处理 : ActorSelection vs. IActorRef

机器之间的 Scala/AKKA Actor 迁移

akka - 使用 Akka HTTP 上传多部分表单数据