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

时间:2015-09-11 13:49:45

标签: websocket spring-websocket tyrus socketrocket

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

  1. SocketRocket
  2. 泰鲁斯
  3. 我发现服务器提供的密码通常不是客户端读取的密码。

    对于SocketRocket,我使用代码1000关闭服务器上的websocket,客户端通常读取1001.

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

    来自RFC 6455的密码的说明:

      

    1000表示正常闭合,意味着目的         已经建立了连接。

         

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

         

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

         

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

    我已在服务器上使用Wireshark验证了传出的密码。

    作为将信息从服务器传递到客户端的方法,密码是否不可靠?在关闭websockets之前,我是否需要在应用程序层实现传递此信息的内容?

1 个答案:

答案 0 :(得分:2)

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

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

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

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