重新连接后,socket.io的“connect”或“reconnect”事件未触发

7

我有一个使用Socket.io的问题。

代码很简单:

var socket = null;
var socketInit = false;    //if it is true, use reconnect

...
function connect() {
    if(!socketInit) {
        socket = io();
        socketInit = true;

        //attach event handlers
        socket.on('connect', function() {
            console.log('connect fired!');
        });
        socket.on('disconnect', function() {
            console.log('disconnect fired!');
        });
        socket.on('reconnect', function() {
            console.log('reconnect fired!');
        });
    }
    else {
        socket.io.connect();
    }
}

...
function disconnect() {
    socket.disconnect();
}

如您所见,有两个函数用于连接或断开套接字。在连接函数中,它将“连接”、“断开连接”、“重新连接”处理程序附加到套接字上。

首先我调用了连接函数,它工作得很好。服务器端也正常工作。然后我调用了断开连接函数,也顺利完成,服务器也同样如此。

但是当我再次调用连接函数时,也就是说“socketInit”变量为真,因此连接函数尝试:

socket.io.connect();

我检查了服务器和客户端控制台,看起来已经连接成功,但问题是事件没有被触发!

服务器端的 'connection' 事件在重新连接时被触发,但客户端的 'connect' 或 'reconnect' 事件却没有被触发。我尝试找出问题所在,但仍然无法理解。我多次检查了 Web 控制台和服务器控制台,连接本身正常工作,但问题在于事件无法正常工作!

如果有人知道原因,请帮助我解决。谢谢 ;)

p.s. 我尝试添加了 'reconnected'、'reconnection' 和 'reconnect_error' 事件处理程序,但都没有起作用。


我不确定你是否可以像那样做。谁正在连接这个套接字?如果是socket.io客户端,那么只有客户端才能重新连接。 - Simone Zandara
xbirkett// 感谢您的评论。那些是客户端代码。我想要做的就是让客户端可以随时连接/断开/重新连接。您对此有更好的建议吗?如果您能给我一个更好的方法,我将不胜感激 ;) - modernator
2个回答

7
如果你正在使用Socket.io 1.0版本,尝试在套接字上使用io管理器来处理手动断开连接和重新连接。
var socket = null;
var socketInit = false;

function connect() {
    if(!socketInit) {
        socket = io();
        socketInit = true;

        //attach event handlers
        socket.on('connect', function() {
            console.log('connect fired!');
        });
        socket.on('disconnect', function() {
            console.log('disconnect fired!');
        });
        socket.on('reconnect', function() {
            console.log('reconnect fired!');
        });
    }
    else {
        socket.io.reconnect();
    }
}


function disconnect() {
    socket.io.disconnect();
}

在套接字上,应该在其后发出reconnecting_attempt、reconnecting、reconnected和connected事件。


这似乎在使用socket.io时不再起作用了,因为现在断开连接会设置skipReconnecting=true,所以调用.reconnect()将无效,而调用connect()可以重新连接socket但不会触发事件! - Gregory Magarshak
似乎我们只有“打开”和“关闭”事件,但连接和断开的数据包从未到达? - Gregory Magarshak

2
我正在使用socket.io 2.1.1,以下是socket.io在断开连接后重新连接时处理的所有事件序列:
只需执行socketClient.on(eventName, callBackFunc); 请参见以下示例图像: enter image description here

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