当前位置: 首页 > 知识库问答 >
问题:

从服务器关闭akka-http websocket连接

施令雪
2023-03-14

关闭连接可以通过取消来自服务器逻辑的传入连接流(例如,将其下游连接到sink.canceled并将其上游连接到source.empty)。还可以通过取消IncomingConnection源连接来关闭服务器的套接字。

但考虑到接收器会在协商新连接时设置一次,我不清楚如何做到这一点:

(get & path("ws")) {
  optionalHeaderValueByType[UpgradeToWebsocket]() {
    case Some(upgrade) ⇒
      val connectionId = UUID()
      complete(upgrade.handleMessagesWithSinkSource(sink, source))
    case None ⇒
      reject(ExpectedWebsocketRequestRejection)
  }
}

共有1个答案

戚阳
2023-03-14

提示:此答案基于Akka-Stream-Experiment版本2.0-M2。其他版本的API可能略有不同。

关闭连接的一种简单方法是使用pushstage:

import akka.stream.stage._

val closeClient = new PushStage[String, String] {
  override def onPush(elem: String, ctx: Context[String]) = elem match {
    case "goodbye" ⇒
      // println("Connection closed")
      ctx.finish()
    case msg ⇒
      ctx.push(msg)
  }
}

在客户端或服务器端接收的每个元素(通常,通过flow的每个元素)都通过这样的stage组件。在Akka中,完整的抽象称为graphstage,更多信息可以在官方文档中找到。

val connection = Tcp().outgoingConnection(address, port)

val flow = Flow[ByteString]
  .via(Framing.delimiter(
      ByteString("\n"),
      maximumFrameLength = 256,
      allowTruncation = true))
  .map(_.utf8String)
  .transform(() ⇒ closeClient)
  .map(_ ⇒ StdIn.readLine("> "))
  .map(_ + "\n")
  .map(ByteString(_))

connection.join(flow).run()
 类似资料:
  • 我一直试图通过Postgre DB Server运行这个批处理文件,并运行两个不同的sql文件,如下所示: 但是问题来了,有时我会得到下面的命令query1或query2的错误: 这种情况只是偶尔发生,所以我不完全确定为什么会发生。有人能解释为什么会这样,以及这个问题是否有解决办法吗?谢谢! 更新:在实际的Postgre应用程序中尝试打开远程服务器时,我有时也会遇到相同的错误:“出现错误:”服务器

  • 我是Ruby on Rails的新手。我通过教程创建了两个基本的演示应用程序 PG::错误 服务器意外关闭了连接这可能意味着服务器在处理请求之前或处理请求时异常终止。 而且有时(通常是在我重新启动postgresql时), PG::错误 服务器意外关闭了连接这可能意味着服务器在处理请求之前或处理请求时异常终止。无法发送启动数据包:管道中断 这是我的堆栈跟踪 我在Ubuntu12.04(因为goog

  • 我写了一个JAVA代码,使用Apache Commons Net FTPClient遍历FTP位置,并在Excel文件中获得输出。 我正在使用commons-net-3.0.1。罐子我做了一些测试 并发送,但仍会收到相同的错误。 我要做的就是遍历一个目录,如果找到了文件,就在excel中获取文件名和文件更新日期,如果找到了目录,就进入目录,直到再次找到文件。 请帮助并询问是否需要任何其他信息。我是

  • 问题内容: 当我使用节点mysql时,在12:00到2:00之间出现错误,表明服务器已关闭TCP连接。这是完整的消息: 有解决办法。但是,以这种方式尝试后,问题也会出现。现在我不知道该怎么办。有人遇到这个问题吗? 这是我按照解决方案编写的方式: 问题答案: 尝试使用以下代码来处理服务器断开连接: 在您的代码中,我错过了之后的部分

  • 问题内容: 我试图重现我在EC2上的node.js应用中看到的MySQL错误,其中包含节点mysql库: 连接丢失:服务器关闭了连接。 我无法在本地重现该错误-通过我的代码可以很好地处理数据库- 它仅每隔几秒钟重新检查一次,并在重新启动后重新连接到db。在EC2上,它发生在太平洋时间凌晨4点左右,但是数据库仍然正常运行。 我想 用我的本地mysql重现崩溃 在我的mysql帮助器模块中添加我需要的

  • 更新如果我使用ws.close()从客户端关闭连接,那么一切都很好。