Play framework / Akka Streams:检测 WebSocket 何时关闭

Play framework / Akka Streams: Detecting when a WebSocket has closed

当直接使用 Akka Streams 处理 WebSockets 时,我没有找到正确的方法来知道客户端何时断开连接(正常断开或由于崩溃或超时)。我使用的是官方文档中的基本示例:

import play.api.mvc._
import akka.stream.scaladsl._

def socket = WebSocket.accept[String, String] { request =>

  // Log events to the console
  val in = Sink.foreach[String](println)

  // Send a single 'Hello!' message and then leave the socket open
  val out = Source.single("Hello!").concat(Source.maybe)

  Flow.fromSinkAndSource(in, out)
}

我需要知道客户端何时不再连接。

使用watchTermination:

def socket = WebSocket.accept[String, String] { request =>
  val in = Sink.foreach[String](println)
  val out = Source.single("Hello!").concat(Source.maybe)

  Flow.fromSinkAndSource(in, out)
    .watchTermination() { (_, fut) =>
      fut onComplete {
        case Success(_) =>
          println("Client disconnected")
        case Failure(t) =>
          println(s"Disconnection failure: ${t.getMessage}")
      }
    }
}