获取 websockets 以关闭代码 1006 关闭的原因

2022-08-30 05:25:13

我想得到websockets关闭的原因,这样我就可以向用户显示正确的消息。

我有

sok.onerror=function (evt) 
     {//since there is an error, sockets will close so...
       sok.onclose=function(e){
           console.log("WebSocket Error: " , e);}

代码始终为 1006,原因始终为 “ ”。但我想把不同的结束原因分开。

例如,comand行给出了一个错误原因:“你不能删除它,因为数据库不会让你”。但在Chrome的控制台上,原因仍然是“ ”。

有没有其他方法可以区分不同的关闭原因?


答案 1

关闭代码 1006 是一个特殊代码,表示浏览器实现异常(本地)关闭了连接。

如果您的浏览器客户端报告关闭代码,那么您应该查看事件以获取详细信息。1006websocket.onerror(evt)

但是,Chrome很少会向Javascript端报告任何关闭代码原因。这可能是由于 WebSocket 规范中的客户端安全规则,以防止滥用 WebSocket。(例如,使用它来扫描目标服务器上的开放端口,或为拒绝服务攻击生成大量连接)。1006

请注意,如果在 HTTP 升级到 Websocket 期间出现错误,Chrome 通常会报告关闭代码(这是 WebSocket 在技术上“连接”之前的步骤)。由于身份验证或授权不当,或协议使用不当(例如请求子协议,但服务器本身不支持相同的子协议),甚至尝试与不是WebSocket的服务器位置通信(例如尝试连接到1006ws://images.google.com/)

从根本上说,如果你看到一个关闭的代码,你有一个非常低级的错误与WebSocket本身(类似于“无法打开文件”或“套接字错误”),并不是真正为用户准备的,因为它指向你的代码和实现的低级问题。修复低级别问题,然后在连接后,可以包含更合理的错误代码。您可以在项目的范围或严重性方面实现这一点。示例:信息和警告级别是项目特定协议的一部分,不会导致连接终止。对于严重或致命的消息报告,还可以使用项目的协议来传达尽可能多的详细信息,然后使用WebSocket关闭流的有限功能关闭连接。1006

请注意,WebSocket 关闭代码的定义非常严格,并且关闭原因短语/消息的长度不能超过 123 个字符(这是有意的 WebSocket 限制)。

但是,如果您只是出于调试原因而想要此信息,那么关闭的详细信息及其根本原因通常会在Chrome的Javascript控制台中报告相当多的详细信息。


答案 2

在我和可能@BIOHAZARD的情况下,它是.默认情况下,它是秒,在套接字中没有活动nginx proxy timeout60

我把它改成了24小时,它解决了问题nginx

proxy_read_timeout 86400s;
proxy_send_timeout 86400s;