2

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

  1. 套接字火箭
  2. 泰鲁斯

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

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

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

来自RFC 6455的关闭代码的描述:

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

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

1006 是保留值,绝不能在端点关闭控制帧中设置为状态码。它被指定用于期望状态代码指示连接已异常关闭的应用程序,例如,没有发送或接收关闭控制帧。

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

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

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

4

1 回答 1

2

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

你为什么不试试nv-websocket-client看看发生了什么?库的侦听器接口(WebSocketListener )的onDisconnected方法定义如下。

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

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

于 2015-09-11T18:04:34.940 回答