【问题标题】:socket.io disconnect then reconnectsocket.io 断开然后重新连接
【发布时间】:2013-11-21 02:37:13
【问题描述】:

我正在尝试断开客户端的连接,然后重新连接。

我可以使用 socket.disconnect(); 断开客户端与服务器端的连接

但我无法再次连接它,有什么办法吗?

问题是我在客户端connect callback 中进行了特定处理,如果我在断开连接事件后尝试连接客户端,它永远不会触发回调,我不明白为什么。

这是一个明显的例子:

客户

var Socket = io.connect('http://127.0.0.1:3000');

function bind_socket(Socket) {
    Socket.on('connect', function()  {
        console.log('Socket connected !');
    });

    Socket.on('event', function(data)  {
        console.log('Receive event: '+data);
    });

    Socket.on('disconnect', function()  {
        console.log('Socket disconnected !');

        var Socket = io.connect('http://127.0.0.1:3000'); //Doesn't fire the "connect" callback
        bind_socket(Socket);
        Socket.emit('event', 3);
    });
}

bind_socket(Socket);
Socket.emit('event', 1);

服务器

var io = require('socket.io').listen(3000);
io.on('connection', function(socket) {
    console.log('socket '+socket.id+' connect');

    socket.on('event', function(data) {
        console.log('Receive Event: '+data);
        socket.disconnect();
        this.emit('event', 2);
    });

    socket.on('disconnect', function() {
        console.log('socket '+this.id+' disconnect');
    });
});

【问题讨论】:

  • 实际上我用了几个月的 socket.io ..在开发中它工作得很好但是在生产中你会遇到很多关于 CPU 和内存的问题 ..切换到 sockjs 会更好
  • 是的,我希望 v1.0 能尽快推出(我一直这么说已经超过 6 个月了……)。我将 socket.io 用于其rooms 服务,在 sockjs 上似乎不存在,但我同意它可能是一个更好的选择,因为 socket.io 看起来被遗弃了......
  • 这里也一样...我正在等待 1.0 版,但是如果您在他们的 github 页面上查看活动 ..有超过 500 个未解决的问题 ..sockjs 更好但功能更少

标签: socket.io


【解决方案1】:

答案是使用Socket.socket.reconnect();

(其中Socket 是连接事件返回的“原始”套接字)。

【讨论】:

  • 这对我很有帮助。特别是在测试期间,您必须多次连接和重新连接以测试不同的事件。谢谢!
  • 从 Socket.IO 2.x 开始,这不再正确。使用connect() 代替@Qiulang 在his answer 中提到。
【解决方案2】:

如果您使用的是 Socket.io 1.0,请尝试使用套接字上的io 管理器来执行disconnect()reconnect()

查看Socket.io - Manual reconnect after client-side disconnect上的示例

【讨论】:

  • 这似乎是socket.io 1.x的方式,非常感谢!与 socket.disconnect() 不同,socket.io.disconnect() 触发断开处理程序并且实际上终止了连接。 socket.disconnect() 只调用处理程序...
【解决方案3】:

尝试使用

socket.disconnect(2);

(意外发现) - 这会发送不同的断开连接错误代码: '失败:在收到握手响应之前连接已关闭'。然后前端套接字正在尝试重新连接。

但是你又遇到了另一个问题——socket connect/disconnect 会导致连接泛滥。

【讨论】:

    【解决方案4】:

    如果只使用套接字 2.x socket.connect() 其他关于 reconnect() 的答案在 2.x 中是不正确的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 2021-04-12
      • 2018-01-28
      • 2017-11-05
      相关资源
      最近更新 更多