Node.js 如何重新连接到websocket
流中断后,我无法重新连接到websocket 我不知道数据流中断的根本原因。我的VPS服务器一直处于启动和运行状态,我可以访问它的internet,还有另一个程序同时运行,没有网络问题 但对于收到的每个数据包,我都会增加计数器I,如果我的更改时间超过20秒,那么我会尝试重新连接。但到目前为止,任何代码尝试都失败了,它只是循环并尝试重新连接 Nodejs运行在体面的linux服务器上。断开连接时的内存或CPU使用情况良好。断开连接没有模式,有时运行2天没有问题,有时每天断开4次。当流停止时,重新启动的唯一方法是退出代码并再次运行它,它立即工作,所以服务器端没有问题 我的重新连接代码每20秒运行一次(与我的初始连接代码相同,除了额外的一行:const WebSocket=require('ws') 编辑5.5.2020: 根据下面的建议,我已经修改了上面的代码Node.js 如何重新连接到websocket,node.js,websocket,Node.js,Websocket,流中断后,我无法重新连接到websocket 我不知道数据流中断的根本原因。我的VPS服务器一直处于启动和运行状态,我可以访问它的internet,还有另一个程序同时运行,没有网络问题 但对于收到的每个数据包,我都会增加计数器I,如果我的更改时间超过20秒,那么我会尝试重新连接。但到目前为止,任何代码尝试都失败了,它只是循环并尝试重新连接 Nodejs运行在体面的linux服务器上。断开连接时的内存或CPU使用情况良好。断开连接没有模式,有时运行2天没有问题,有时每天断开4次。当流停止时,重新启
const ws = new WebSocket(...
到
今天,该流自更改以来第一次被丢弃。不幸的是,没有像以前那样尝试在循环中重新连接,代码执行停止,附带图片中的控制台消息。第120行是我修改的行。
我发现您的代码有一个问题:
ws
变量被隐藏
当您执行ws.terminate()
操作时,您正在终止由ws
变量持有的套接字,该变量位于您引用的代码块周围的有效范围内。但是,在传递给setTimeout
以创建新套接字的代码中,您执行const ws=new WebSocket(…]
。执行此操作时,在传递给setTimeout
的匿名函数创建的作用域中声明一个新变量。此变量与外部作用域中的变量同名,但与外部作用域中的变量不同。分配给它时,外部作用域ws
为否t受影响。因此,新套接字被创建并打开,然后您的代码将忘记它。因此,是的,您的代码将再次尝试重新连接
只需删除const
并使用ws=new WebSocket(…)
就可以了。显然,要使其工作,外部范围中定义的ws
变量不能用const-ws
声明。它必须用let-ws
声明,或者不如用var-ws
声明
我还建议一般使用配置了一组合理规则的linter-like。eslint
具有报告隐藏变量和防止隐藏错误的规则
此外,我建议您使用类似的方法,而不是尝试使用您自己的重新连接代码。有各种各样的边缘情况与重新连接套接字有关。我是否可以建议在WebSocket上使用协议?这将使您更自由地避免这些错误,并确保服务质量。MQTT就是这样的协议之一
https://www.npmjs.com/package/mqtt
好的,我已经实现了更改为ws=newwebsocket(…)。过几天我会回来报告。如前所述,问题并非每天都会出现。Tx。尚未工作,请参阅我在原始帖子中的编辑。错误消息向我建议,外部上下文中的变量是用
const
声明的。显然,如果它是const
,则无法重新分配它。您需要用let ws
或var ws
声明它var
是一种古老的技术,它附带了一系列的问题。我建议使用let ws
。Inded第一个实例也是用const定义的。只需从另一个地方复制/粘贴它,而没有真正理解它。我现在已经实现了更改(let ws),让我们看看未来几天的情况。Tx。自从更改后,我没有任何断开连接的事件,但由于赏金在几个小时后到期,如果没有分配,我们双方都将失去赏金,我现在将您的答案标记为解决方案,以表彰您在这方面花费的时间。一旦我能够验证您提出的修改,我的问题就会得到解决问题(或否),我将更新此线程。
ws = new WebSocket(...
https://www.npmjs.com/package/mqtt