首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >节点websockets/ws - WSS:如何判断我是关闭了连接,还是他们关闭了连接?

节点websockets/ws - WSS:如何判断我是关闭了连接,还是他们关闭了连接?
EN

Stack Overflow用户
提问于 2018-02-12 18:53:19
回答 1查看 3.1K关注 0票数 2

安装程序

我正在使用websockets/ws库来收听WSS提要。它工作得很好,它足够轻量级,它似乎是最快的之一(这一点很重要)。

我试图区分以编程方式关闭连接和他们以任何理由关闭连接。

根据医生们,我可以发送一个code (int)和一个reason (字符串),这两个字符串都被发送到论近距离事件。但是从所有帐户来看,这个功能已经不存在了。

测试

  • 大多数代码都会引发First argument must be a valid error code number错误
  • 将其保留为空白将向事件发送code = 1005和空reason
  • 如果输入1005代码,就会得到无效的错误
  • 如果输入1000代码,事件将接收code = 1006,仍然是空的reason (不管我放了什么)。

测试很简单..。

代码语言:javascript
运行
复制
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);

但是.

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

我可以做一些类似..。

代码语言:javascript
运行
复制
_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几乎毫无意义,所以不管它为什么关闭,它都会自动重新启动连接。如果连接丢失或超时,这很好,但如果我想以编程方式关闭它,则不太好.

代码语言:javascript
运行
复制
someFeed.close(); // Connection immediately reopens, always and forever

问题

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

还是有一个同样轻量级和闪电般的库,具有我正在寻找的功能?我只需要能够可靠地发送唯一的code和/或reason,所以当我试图手动关闭它时我就知道了。我知道,要求推荐是禁忌,但有太多的库来测试每一个,而且没有我能找到的基准。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-12 19:10:32

来自@Bergi的建议

代码语言:javascript
运行
复制
_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);

然后用它..。

代码语言:javascript
运行
复制
someFeed.didIClose = true;
someFeed.close();    // Won't reopen the connection

或者稍微干净一点..。

代码语言:javascript
运行
复制
someFeed.forceClose();

编辑#1

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48753517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档