安装程序
我正在使用websockets/ws库来收听WSS提要。它工作得很好,它足够轻量级,它似乎是最快的之一(这一点很重要)。
我试图区分以编程方式关闭连接和他们以任何理由关闭连接。
根据医生们,我可以发送一个code
(int)和一个reason
(字符串),这两个字符串都被发送到论近距离事件。但是从所有帐户来看,这个功能已经不存在了。
测试
First argument must be a valid error code number
错误code = 1005
和空reason
。1005
代码,就会得到无效的错误1000
代码,事件将接收code = 1006
,仍然是空的reason
(不管我放了什么)。测试很简单..。
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);
..。但是,由于code
和reason
几乎毫无意义,所以不管它为什么关闭,它都会自动重新启动连接。如果连接丢失或超时,这很好,但如果我想以编程方式关闭它,则不太好.
someFeed.close(); // Connection immediately reopens, always and forever
问题
我如何区分不同的关闭?我不想更改库代码,因为当我移动自己的代码时,我不能使用npm install
。我可以在我自己的代码中重写close方法吗?
还是有一个同样轻量级和闪电般的库,具有我正在寻找的功能?我只需要能够可靠地发送唯一的code
和/或reason
,所以当我试图手动关闭它时我就知道了。我知道,要求推荐是禁忌,但有太多的库来测试每一个,而且没有我能找到的基准。
发布于 2018-02-12 19:10:32
来自@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()
方法--只需要一行干净的代码就可以编程地关闭它(而不是两行)。
https://stackoverflow.com/questions/48753517
复制相似问题