Socket.io 断开连接后重新连接

4

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

我能够使用socket.disconnect();从服务器端断开客户端连接。

但是我无法重新连接它,有没有一种方法可以实现?

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

下面是一个清晰的示例:

客户端

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更好。 - Remon Amin
是的,我希望v1.0很快就会推出(我已经说了6个多月了...)。我使用socket.io的“rooms”服务,似乎在sockjs上不存在,但我同意这可能是一个更好的选择,因为“socket.io”看起来被遗弃了... - Ludo
这里也一样...我在等待1.0版本,但如果你查看他们的Github页面上的活动,会发现有500多个未解决的问题...SockJS更好,但功能较少。 - Remon Amin
4个回答

7

这似乎是使用socket.io 1.x的正确方式,非常感谢!与socket.disconnect()不同,socket.io.disconnect()触发断开处理程序并且实际终止连接。socket.disconnect()仅调用处理程序... - Daniel Stelter

6
答案是使用Socket.socket.reconnect();(其中Socket是连接事件返回的“原始”套接字)。

这真的帮了我很大的忙。特别是在测试期间,当您需要多次连接和重新连接以测试不同的事件时。谢谢! - ninja123
截至 Socket.IO 2.x 版本,这不再正确。如@Qiulang在他的答案中提到的那样,请改用connect() - seanCodes

4
如果使用socket 2.x,只需socket.connect(),其他答案中提到的reconnect()在2.x中是不正确的。

0

尝试使用

socket.disconnect(2);

(无意中发现了这个)- 这会发送不同的断开连接错误代码:'failed: Connection closed before receiving a handshake response'。然后前端套接字尝试重新连接。

但是,您会遇到另一个问题 - 套接字连接/断开会导致连接洪水。


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