我有一个Spring Boot Tomcat服务器正在处理来自正在使用的客户端的websocket连接:
我发现服务器提供的密码通常不是客户端读取的密码。
对于SocketRocket,我使用代码1000关闭服务器上的websocket,客户端通常读取1001.
对于Tyrus,我用代码1011关闭websocket,客户端读取1006或1011.
来自RFC 6455的密码的说明:
1000表示正常闭合,意味着目的 已经建立了连接。
1001表示端点“正在离开”,例如服务器 下降或浏览器已离开页面。
1006是保留值,不得设置为a中的状态码 由端点关闭控制框架。它被指定用于 应用程序期望状态代码指示 连接异常关闭,例如,没有发送或 收到关闭控制框架。
1011表示服务器正在终止连接,因为 它遇到了阻止它的意外情况 满足要求。
我已在服务器上使用Wireshark验证了传出的密码。
作为将信息从服务器传递到客户端的方法,密码是否不可靠?在关闭websockets之前,我是否需要在应用程序层实现传递此信息的内容?
答案 0 :(得分:2)
这只是猜测,但您列出的WebSocket客户端可能无法正确实现结束握手。
为什么不尝试 nv-websocket-client 来查看发生了什么?库的侦听器接口(onDisconnected)的WebSocketListener方法定义如下。
void onDisconnected(
WebSocket websocket,
WebSocketFrame serverCloseFrame,
WebSocketFrame clientCloseFrame,
boolean closedByServer);
第二个参数serverCloseFrame
是服务器发送给客户端的关闭帧,第三个参数clientCloseFrame
是客户端发送给服务器的关闭帧。在正常情况下,根据规范的要求,两个关闭帧的有效载荷是相同的。