停止socket.io的重新连接

20

简单场景:

  1. 客户端使用socket.io连接到服务器(socket = io.connect(...))
  2. 服务器崩溃
  3. 客户端尝试重新连接
  4. 用户要求客户端断开连接(socket.disconnect())
  5. 服务器启动
  6. 客户端重新连接

看起来一旦 socket.io 开始尝试重新连接,就不能再停止。我希望步骤4可以阻止步骤6的发生,但它无法阻止。我需要调用什么方法?

7个回答

36

您可能想要自己处理重新连接。

// Disables the automatic reconnection
var socket = io.connect('http://server.com', {
    reconnection: false
});

// Reconnects on disconnection
socket.on('disconnect', function(){
    socket.connect(callback);
});

注意:旧版本使用reconnect而不是reconnection


12
目前看起来选项已经更改为reconnection: false 链接 - drodsou

2
我认为你需要做的是 配置 socket.ioclient,使其不进行reconnect,只需将reconnect属性设置为false
我创建了一个小型服务器(server.js)来测试这个功能。
var io = require('socket.io').listen(8888);

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

然后我创建了这个 test.js 文件来测试它是否不会重新连接。
var client = require('socket.io-client'),
    socket = client.connect('http://localhost:8888', {
        'reconnect': false
    });

socket.on('connect', function () {
    socket.on('news', function (data) {
        console.log(data);
        socket.emit('my other event', { my: 'data' });
    });
});

为了让 test.js 正常工作,您需要从 npm 安装 socket.io-client,可以通过执行 npm install socket.io-client 或将 (dev-)dependency socket.io-client 添加到您的 package.json 中。
当我停止运行 server.js 时,test.js 正在运行,test.js 将立即返回,这是您期望的结果。当我将 reconnect 设置为 true 时,客户端将尝试重新连接到服务器,这不是期望的行为。

1
但我希望它重新连接 - 直到我明确告诉它断开连接,然后它应该停止尝试。 - Lemming
2
好的。我认为你应该自己编写那个逻辑。这不应该很难。我过去也写过类似的逻辑,它会继续重试 => https://dev59.com/EG855IYBdhLWcg3wSSOl#4433929 - Alfred
感谢您的努力!您是对的,这并不难。 尽管如此,我仍然认为这是socket.io中的一个bug。 ;) - Lemming

0
尝试以下代码:
self.socket?.manager?.reconnects = false

2
感谢您提供这段代码片段,它可能会提供一些有限的、即时的帮助。通过展示为什么这是一个好的解决方案,一个适当的解释将极大地提高其长期价值,并使其对未来读者具有其他类似问题更有用。请[编辑]您的答案以添加一些解释,包括您所做出的假设。 - Blue

0

我的简单解决方案是,为了避免全局使用套接字选项而仅在需要时避免重新连接,我在disconnect事件上调用disconnect()方法:

socket.on('disconnect', (reason) => {
  socket.disconnect();
  socket = null;
});

0

对我来说,这个很好用,尽管在完全停止之前会多尝试一次。

"socket.io-client": "2.2.0"

this.socket.io.reconnectionAttempts(0);


1
请在您的答案中添加一些解释,以便其他人可以从中学习。 - Nico Haase

0
在新的socket.io 1.1.x版本中,你可以做以下操作:
var manager = io.Manager('http://localhost:9823', { autoConnect: false });

这里是博客链接


2
博客的链接已失效。 - Joe the Person

-1

你可以直接调用socket.disconnect(),这样它就会停止尝试重新连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接