客户端Websocket关闭代码为什么与服务器代码不匹配?

3

我有一个处理websocket连接的Spring Boot Tomcat服务器,它接收以下客户端使用的连接:

  1. SocketRocket
  2. Tyrus

我发现服务器提供的关闭代码通常与客户端读取的关闭代码不一致。

对于SocketRocket,我在服务器上使用1000代码关闭websocket,而客户端经常读取1001。

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

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

1000表示正常关闭,意味着建立连接的目的已经实现。

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

1006是保留值,绝不能由端点在一个Close控制帧中设置为状态码。这是指定用于应用程序期望状态码以指示连接异常关闭(例如,在没有发送或接收Close控制帧的情况下)。

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

我已经通过Wireshark在服务器上验证了传出的关闭代码。

关闭代码只是作为从服务器传递信息到客户端的一种不可靠的方式吗?我需要在应用程序层实现传递该信息的功能,然后再关闭websocket吗?

1个回答

3
这只是一个猜测,但你列出的WebSocket客户端可能没有正确实现关闭握手。为什么不尝试使用nv-websocket-client查看发生了什么?该库的监听器接口(WebSocketListener)的onDisconnected方法定义如下。
void onDisconnected(
        WebSocket websocket,
        WebSocketFrame serverCloseFrame,
        WebSocketFrame clientCloseFrame,
        boolean closedByServer);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接