Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何重新连接到websocket_Node.js_Websocket - Fatal编程技术网

Node.js 如何重新连接到websocket

Node.js 如何重新连接到websocket,node.js,websocket,Node.js,Websocket,流中断后,我无法重新连接到websocket 我不知道数据流中断的根本原因。我的VPS服务器一直处于启动和运行状态,我可以访问它的internet,还有另一个程序同时运行,没有网络问题 但对于收到的每个数据包,我都会增加计数器I,如果我的更改时间超过20秒,那么我会尝试重新连接。但到目前为止,任何代码尝试都失败了,它只是循环并尝试重新连接 Nodejs运行在体面的linux服务器上。断开连接时的内存或CPU使用情况良好。断开连接没有模式,有时运行2天没有问题,有时每天断开4次。当流停止时,重新启

流中断后,我无法重新连接到websocket

我不知道数据流中断的根本原因。我的VPS服务器一直处于启动和运行状态,我可以访问它的internet,还有另一个程序同时运行,没有网络问题

但对于收到的每个数据包,我都会增加计数器I,如果我的更改时间超过20秒,那么我会尝试重新连接。但到目前为止,任何代码尝试都失败了,它只是循环并尝试重新连接

Nodejs运行在体面的linux服务器上。断开连接时的内存或CPU使用情况良好。断开连接没有模式,有时运行2天没有问题,有时每天断开4次。当流停止时,重新启动的唯一方法是退出代码并再次运行它,它立即工作,所以服务器端没有问题

我的重新连接代码每20秒运行一次(与我的初始连接代码相同,除了额外的一行:const WebSocket=require('ws')

编辑5.5.2020: 根据下面的建议,我已经修改了上面的代码

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