gpt4 book ai didi

javascript - Node websockets/ws - WSS : How to tell if I closed the connection, 或者他们做到了?

转载 作者:行者123 更新时间:2023-12-01 02:26:28 25 4
gpt4 key购买 nike

设置

我正在使用websockets/ws库来收听 WSS 源。它工作得很好,足够轻,它似乎是 fastest around 之一。 (这很重要)。

我试图区分我以编程方式关闭连接和他们出于任何原因关闭连接。

根据the docs ,我可以发送一个code(整数)和一个reason(字符串),两者都发送到 on close event 。但无论如何,这个功能已经不存在了。

测试

  • 大多数代码都会抛出第一个参数必须是有效的错误代码号错误
  • 将其留空会向事件发送 code = 1005 和空的reason
  • 如果我输入代码 1005,则会收到无效错误
  • 如果我输入代码 1000,事件会收到 code = 1006,但仍然是空的原因(无论我输入什么)

^ 测试足够简单...

var WebSocket = require('ws');

var ws = new WebSocket(url);
ws.on('close', function(code, reason) {
console.log(code);
console.log(reason);
});

var code = 1234,
reason = 'whatever reason';

setTimeout(function() {
ws.close(code, reason);
}, 5000);

但是...

我需要能够判断我是否已关闭连接,或者是否因其他原因关闭(连接丢失,他们因时间限制而关闭连接等)。根据关闭的原因,我有时需要立即重新打开连接,但只是有时

我可以做类似的事情

_initWS(url) {
var ws = new WebSocket(url);

ws.on('open', function() {...});

ws.on('close', function(code, reason) {
ws = null; // Don't know if needed
ws = _initWS(url); // Reopen the connection, for ever and ever...
});

ws.on('message', funciton(msg) {...});

return ws;
}

var someFeed = _initWS(someURL);

...但是由于 codereason 几乎毫无意义,因此无论连接为何关闭,都会自动重新启动连接。如果连接丢失或超时,这很好,但如果我想以编程方式关闭它,那就不太好了......

someFeed.close(); // Connection immediately reopens, always and forever

问题

如何区分不同的关闭方式?我不想更改库代码,因为这样当我移动自己的代码时就无法使用 npm install 。我可以在自己的代码中重写 close 方法吗?

或者是否有一个同样轻量级且快如闪电的库具有我正在寻找的功能?我只需要能够可靠地发送唯一的代码和/或原因,这样我就知道何时尝试手动关闭它。我知道寻求建议是一种禁忌,但是有太多的库无法测试每个库,而且我找不到基准测试。

最佳答案

来自@Bergi的建议

_initWS(url) {
var ws = new WebSocket(url);

ws.didIClose = false; // This is the flag to set if I close it manually

ws.forceClose = function() {
ws.didIClose = true;
ws.close();
};

ws.on('open', function() {...});

ws.on('close', function(code, reason) {
if(!ws.didIClose) { // If I didn't close it, reopen
ws = null;
ws = _initWS(url);
}

});

ws.on('message', funciton(msg) {...});

return ws;
}

var someFeed = _initWS(someURL);

然后使用它...

someFeed.didIClose = true;
someFeed.close(); // Won't reopen the connection

或者,更干净一点......

someFeed.forceClose();

编辑#1

修改解决方案以包含 forceClose() 方法 - 只需一行干净的代码即可以编程方式关闭它(而不是两行)。

关于javascript - Node websockets/ws - WSS : How to tell if I closed the connection, 或者他们做到了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48753517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com