【问题标题】:Node websockets/ws - WSS: How to tell if I closed the connection, or they did?节点 websockets/ws - WSS:如何判断我是关闭了连接,还是他们关闭了?
【发布时间】:2018-02-12 18:53:19
【问题描述】:

设置

我正在使用websockets/ws 库来收听 WSS 提要。它运行良好,足够轻巧,似乎是fastest around 之一(这很重要)。

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

根据the docs,我可以发送一个code(int)和一个reason(字符串),两者都发送到on close event。但从各方面来说,这个功能已经不存在了。

测试

  • 大多数代码都会抛出 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);

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

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

问题

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

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

【问题讨论】:

  • 只要记住你是否想要关闭它。
  • @Bergi 你是什么意思?
  • 当您以编程方式从您身边关闭连接时,您应该知道您这样做了,并且可能您可以检查它的原因是否仍然存在。或者只使用布尔标志。
  • @Bergi 我不知道我是否明白。无论 为什么 它关闭,它都必须通过 close 事件 - 这是我需要从其他关闭自动重新打开连接的地方。我可以关闭它的唯一方法是.close(),然后触发close 事件并重新打开。我可以在close 事件中设置一个条件,但我无法通过.close() 向它发送任何内容

标签: javascript node.js websocket


【解决方案1】:

来自@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() 方法 - 只需要一行干净的代码以编程方式关闭它(而不是两行)。

【讨论】:

  • 是的,完全一样。顺便说一句,其他分配之前的ws = null 确实毫无意义。
猜你喜欢
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 2014-10-05
  • 2012-07-30
  • 2012-05-01
  • 1970-01-01
  • 2012-10-07
相关资源
最近更新 更多