我编写了一个使用Web套接字在服务器和客户端之间进行通信的应用程序。我想处理客户端过时(太旧)的情况,因此会误解/不适当地处理消息。我的想法是,如果客户端太旧,我会关闭连接并发送相应的状态代码。我阅读了规范,似乎1002 可能是适当的代码:
1002 indicates that an endpoint is terminating the connection due
to a protocol error.
但是,我实际上并不知道这意味着什么(如果它实际上是指Web套接字协议,因此是较低级别的错误)。 1002是否适用于此,或者我是否应在此处定义的4000-4999区域中创建自定义(应用程序)关闭代码:https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent
答案 0 :(得分:10)
错误代码1002
用于低级WebSocket协议违规。例如,WebSocket消息是文本消息,但有效负载包含无效的UTF8。你不应该在那种情况下使用它。错误1002
通常由WebSocket实现的内部生成,而不是使用WebSocket的应用程序生成。
现在,在您的情况下,您有两种选择:
如果在WebSocket打开握手期间客户端可能已被识别为“太旧”,则您可能已使用HTTP错误请求400进行握手失败。
您可以允许握手完成,执行一些确定客户端版本的WebSocket消息交换,然后使用4000-4999
范围内的错误代码关闭连接(执行正确的WebSocket关闭握手)。是的,这个范围是合适的。 https://tools.ietf.org/html/rfc6455#section-7.4.2
后者更灵活,可为客户提供更好的反馈。特别是,浏览器中的JavaScript只能访问密码(2),而不能访问(1)中的任何HTTP错误。
另一个值得注意的方面:符合标准的WebSocket实现将不允许应用程序触发与1002
的关闭。允许应用程序使用的唯一密码是1000
(“正常”关闭)和3000 - 3999
(应用程序使用,但在IETF注册)和4000 - 4999
(应用程序使用,私有未注册)