通过密码1006获取websockets关闭的原因

sle*_*vin 69 javascript websocket

我想得到websockets关闭的原因,所以我可以向用户显示正确的消息.

我有

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

代码总是1006,原因总是"".但我想分别说明不同的结果原因.

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

还有其他方法可以区分不同的结果原因吗?

Joa*_*elt 102

Close Code1006是一个特殊代码,表示浏览器实现异常(本地)连接已关闭.

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

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

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

从根本上说,如果你看到一个密切的代码1006,你的websocket本身就会出现一个非常低级别的错误(类似于"无法打开文件"或"套接字错误"),这对用户来说并不是真正意义上的,因为它指的是一个低级问题与您的代码和实现.修复您的低级问题,然后在连接时,您可以包含更合理的错误代码.您可以在项目的范围或严重性方面完成此任务.示例:信息和警告级别是项目特定协议的一部分,不会导致连接终止.有严重或致命的消息报告也使用您的项目协议传达尽可能多的细节,然后使用websocket关闭流程的有限能力关闭连接.

请注意,WebSocket密码严格定义,密码短语/消息的长度不能超过123个字符(这是故意的websocket限制).

但并非所有内容都丢失,如果您只是出于调试原因而想要了解这些信息,那么关闭的详细信息及其根本原因通常会在Chrome的javascript控制台中详细报告.

  • Joakim,谢谢,非常详细的anser.如果我使用`sok.onerror = function(evt){console.log(evt);}`,那么细节就不那么多了.甚至不是"理由"或其他东西.那么,根本没有选择?我只是向用户展示,"出了问题,或者没有连接?"不是那么用户友好,如果用户可以看到"你无法删除,导致数据库限制"会很好.任何选择?谢谢 (3认同)

Mix*_*OID 35

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

我将其更改为 24hnginx并解决了问题

proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你!这就是我的例子中出现 1006 错误的原因。 (2认同)

BIO*_*ARD 8

我在 nginx 代理下使用 Chrome 作为客户端和 golang gorilla websocket 作为服务器时遇到错误

每隔 x 秒从服务器向客户端发送一些“ping”消息就解决了问题

更新:噢,天哪,在这个答案之后,我实现了数十个基于 websocket 的应用程序,每 5 秒从客户端 PING一次是保持与服务器连接的正确方法(我不知道当我建议从服务器 ping 时我在想什么)


And*_*rew 7

认为这对其他人可能很方便。知道正则表达式很有用,孩子们。呆在学校。

编辑:把它变成了一个方便的花花公子功能!

let specificStatusCodeMappings = {
    '1000': 'Normal Closure',
    '1001': 'Going Away',
    '1002': 'Protocol Error',
    '1003': 'Unsupported Data',
    '1004': '(For future)',
    '1005': 'No Status Received',
    '1006': 'Abnormal Closure',
    '1007': 'Invalid frame payload data',
    '1008': 'Policy Violation',
    '1009': 'Message too big',
    '1010': 'Missing Extension',
    '1011': 'Internal Error',
    '1012': 'Service Restart',
    '1013': 'Try Again Later',
    '1014': 'Bad Gateway',
    '1015': 'TLS Handshake'
};

function getStatusCodeString(code) {
    if (code >= 0 && code <= 999) {
        return '(Unused)';
    } else if (code >= 1016) {
        if (code <= 1999) {
            return '(For WebSocket standard)';
        } else if (code <= 2999) {
            return '(For WebSocket extensions)';
        } else if (code <= 3999) {
            return '(For libraries and frameworks)';
        } else if (code <= 4999) {
            return '(For applications)';
        }
    }
    if (typeof(specificStatusCodeMappings[code]) !== 'undefined') {
        return specificStatusCodeMappings[code];
    }
    return '(Unknown)';
}
Run Code Online (Sandbox Code Playgroud)

用法:

getStatusCodeString(1006); //'Abnormal Closure'
Run Code Online (Sandbox Code Playgroud)
{
    '0-999': '(Unused)',
    '1016-1999': '(For WebSocket standard)',
    '2000-2999': '(For WebSocket extensions)',
    '3000-3999': '(For libraries and frameworks)',
    '4000-4999': '(For applications)'
}

{
    '1000': 'Normal Closure',
    '1001': 'Going Away',
    '1002': 'Protocol Error',
    '1003': 'Unsupported Data',
    '1004': '(For future)',
    '1005': 'No Status Received',
    '1006': 'Abnormal Closure',
    '1007': 'Invalid frame payload data',
    '1008': 'Policy Violation',
    '1009': 'Message too big',
    '1010': 'Missing Extension',
    '1011': 'Internal Error',
    '1012': 'Service Restart',
    '1013': 'Try Again Later',
    '1014': 'Bad Gateway',
    '1015': 'TLS Handshake'
}
Run Code Online (Sandbox Code Playgroud)

来源(为简洁起见略作修改):https : //developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes


小智 5

当Chrome浏览器不符合WebSocket标准时,情况就是这样。当服务器启动关闭并向客户端发送关闭帧时,Chrome认为这是错误,并使用代码1006并没有原因消息将其报告给JS端。在我的测试中,Chrome从不响应服务器启动的关闭帧(关闭代码1000),表明代码1006可能表示Chrome正在报告自己的内部错误。

PS Firefox v57.00可以正确处理此情况,并成功将服务器的原因消息传递给JS端。