1

我有一个简单的嵌入式 Jetty 9 websocket 服务器。我在带注释的 websocket 实现中有这样的方法:

@OnWebSocketClose
void onClose(int statusCode, String reason) {
    logger.info "Closed connection [${this}]"
    connectionManager.remove(this)
    Event closeEvent = commsEventFactory.buildCloseEvent(this, statusCode, reason)
    eventReceiver.postEvent(closeEvent)
}

我有一个使用 async-http-client 连接到服务器的 spock 测试。我获得了成功的连接,并且可以来回发送消息。

但是,永远不会调用 onClose()(当我调用 async-http-client 的 websocket.close() 或 client.close() 时,甚至当测试 JVM 死机时)。

当套接字的远端消失时,我预计 onClose 会立即触发。

4

1 回答 1

1

onClose() 将触发以指示本地端 websocket 已将状态更改为关闭。

它可能源于:

  • 远程端点已收到正确的 websocket 关闭握手(也称为干净关闭)
  • 任何将尝试发出干净关闭(状态代码 1002)的协议违规(在解析或生成中)。注意:由于这种情况的性质,此关闭可能不是干净的关闭握手。
  • 连接超时,导致异常(非干净)关闭。(状态代码 1006)
  • 套接字上的任何读取 I/O 异常,导致异常(非干净)关闭。(状态代码 1006)
  • 套接字上的任何写入 I/O 异常,导致异常(非干净)关闭。(状态代码 1006)
于 2013-04-25T17:26:48.063 回答