在断开事件中重新连接套接字

7

我试图在断开连接事件被触发后,重新连接具有相同socket.id的套接字。以下是我的socket配置:

var http = require('http').Server(app);
var io = require('socket.io')(http);
var connect_clients = [] //here would be the list of socket.id of connected users
http.listen(3000, function () {
    console.log('listening on *:3000');
});

在断开连接时,如果可能的话,我希望能够使用同一 socket.id 重新连接已断开的用户。
socket.on('disconnect',function(){
var disconnect_id = socket.id; //i want reconnect the users here
});

听起来你假设 socket.id 将唯一标识一个 用户 而不是一个 _连接_。服务器将会为每个连接生成一个新的 id,你无法覆盖它。 - robertklep
如果相同的 socket.id 无法重新连接,我希望使用新生成的 socket id 重新连接它们。 - ujwal dhakal
socket.io-client 的默认设置是自动重新连接的(已在此处文件中记录了 reconnection 选项)。 - robertklep
1个回答

6
默认情况下,Socket.IO没有用于重新连接的服务器端逻辑。这意味着每次客户端想要连接时,都会创建一个新的socket对象,因此它具有新的ID。实现重新连接由你来完成。
为了做到这一点,你需要一种方法来为该用户存储一些东西。如果你有任何形式的身份验证(例如passport),使用socket.request,你将在升级发生之前触发初始HTTP请求。所以从那里开始,你就可以拥有所有种类的cookie和已经存储的数据。
如果你不想在cookie中存储任何内容,最简单的方法是在连接时向客户端发送关于他自己的特定信息。然后,当用户尝试重新连接时,再次发送此信息。类似这样:
var client2socket = {};
io.on('connect', function(socket) {
    var uid = Math.random(); // some really unique id :)
    client2socket[uid] = socket;

    socket.on('authenticate', function(userID) {
        delete client2socket[uid]; // remove the "new" socket
        client2socket[userID] = socket; // replace "old" socket
    });
});

请记住,这只是一个示例,您需要实现更好的方法 :) 可以将信息作为请求参数发送,或以其他方式存储 - 无论哪种方法都可以。


客户端API提供了多种重新连接的选项,但由于文档质量较差,我无法使用它,所以你能帮我解决一下吗? - ujwal dhakal
哦,socket.io确实有重新连接的逻辑,所以你的第一段话完全是错误的。 - jfriend00
我的错,我想说的是服务器端逻辑。谢谢你指出来! - Andrey Popov
我刚刚又偶然看到了这个问题。你应该接受答案、提供自己的答案或删除这个问题 :) - Andrey Popov

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