【问题标题】:Why do client websocket close codes not match the server code?为什么客户端 websocket 关闭代码与服务器代码不匹配?
【发布时间】:2015-12-08 02:39:17
【问题描述】:

我有一个 Spring Boot Tomcat 服务器,它正在处理来自正在使用的客户端的 websocket 连接:

  1. SocketRocket
  2. 泰鲁斯

我发现服务端提供的关闭码往往不是客户端读取的关闭码。

对于SocketRocket,我在服务端关闭websocket,代码1000,客户端经常读到1001。

对于 Tyrus,我使用代码 1011 关闭 websocket,客户端读取 1006 或 1011。

来自RFC 6455的关闭代码说明:

1000 表示正常关闭,意思是 已建立连接。

1001 表示某个端点正在“离开”,例如服务器 关闭或浏览器已离开页面。

1006 是保留值,不得将其设置为状态码 通过端点关闭控制框。它被指定用于 应用程序需要一个状态代码来表明 连接被异常关闭,例如,没有发送或 接收关闭控制框架。

1011 表示服务器正在终止连接,因为 它遇到了阻止它的意外情况 满足请求。

我已在服务器上使用 Wireshark 验证了发出的关闭代码。

作为将信息从服务器传递到客户端的一种方式,关闭代码是否不可靠?在关闭 websocket 之前,我是否需要在应用层实现一些传递这些信息的东西?

【问题讨论】:

    标签: websocket spring-websocket tyrus socketrocket


    【解决方案1】:

    这只是一个猜测,但您列出的 WebSocket 客户端可能无法正确实现关闭握手。

    您为什么不试试 nv-websocket-client 看看发生了什么?库的监听接口(@98​​7654323@)的onDisconnected方法定义如下。

    void onDisconnected(
            WebSocket websocket,
            WebSocketFrame serverCloseFrame,
            WebSocketFrame clientCloseFrame,
            boolean closedByServer);
    

    第二个参数serverCloseFrame是服务器发送给客户端的关闭帧,第三个参数clientCloseFrame是客户端发送给服务器的关闭帧。正常情况下,按照规范要求,两个close frame的payload是相同的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 2010-10-13
      • 1970-01-01
      相关资源
      最近更新 更多