为了账号安全,请及时绑定邮箱和手机立即绑定

获取使用关闭代码1006关闭websocket的原因

/ 猿问

获取使用关闭代码1006关闭websocket的原因

HUX布斯 2019-11-15 21:09:59

我想知道websockets关闭的原因,所以我可以向用户显示正确的消息。


我有


sok.onerror=function (evt) 

     {//since there is an error, sockets will close so...

       sok.onclose=function(e){

           console.log("WebSocket Error: " , e);}

代码始终为1006,原因始终为“”。但是我想分开说出不同的结案原因。


例如,命令行给出了一个错误原因:“您不能删除它,因为数据库不允许您这样做”。但是在Chrome的控制台上,原因仍然是“”。


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


查看完整描述

3 回答

?
慕雪6173905

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


如果您的浏览器客户端报告关闭代码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控制台中报告,并且包含相当详细的信息。


查看完整回答
反对 回复 2019-11-15
?
慕桂英546537

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

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


查看完整回答
反对 回复 2019-11-15
?
波斯汪

就我而言,可能是@BIOHAZARD nginx proxy timeout。默认情况60下,套接字无活动的时间是秒


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


proxy_read_timeout 86400s;

proxy_send_timeout 86400s;


查看完整回答
反对 回复 2019-11-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信