node.js - NodeJS + Socket.io 连接断开/重新连接?

标签 node.js socket.io

在生产中,我有一个使用连接局部变量来保存游戏状态的游戏。但是我注意到,如果我在连接上闲置了一段时间,它会断开连接并重新连接,从而丢失当前状态。在本地主机上进行测试期间,我从未注意到这种行为。这是套接字连接的规范行为还是导致连接断开的其他原因。

如果这是正常行为,通常如何处理?连接值是否应该全局存储,以便在用户断开/重新连接时可以恢复?

最佳答案

您的问题与套接字超时有关。如果某个socket没有事件,socket.io会自动关闭它。

一个简单的(和骇人听闻的)修复方法是向连接的客户端发送心跳以创建事件并阻止套接字超时。

服务器:

function sendHeartbeat(){
    setTimeout(sendHeartbeat, 8000);
    io.sockets.emit('ping', { beat : 1 });
}

io.sockets.on('connection', function (socket) {
    socket.on('pong', function(data){
        console.log("Pong received from client");
    });
}

setTimeout(sendHeartbeat, 8000);

客户:

socket.on('ping', function(data){
      socket.emit('pong', {beat: 1});
    });

更多信息:

您可以获取更多关于配置 socket.io 的信息 here.

编辑:马克评论说,如果用户确实失去了连接(由于互联网问题导致连接中断),您应该能够将用户恢复到他的最后状态。

为此,最好的方法是使用已经广泛使用的方法来存储用户数据、cookie 和 session 。

关于如何做到这一点的非常好的教程located here .尽管他使用 express 来设置 cookie,但您可以使用任何东西来执行此操作(我使用 rails 来执行此操作)。使用此方法,您可以将用户数据存储在 cookie 中并在握手期间获取它。从那里您可以使用 socket.handshake.data 访问数据。

关于node.js - NodeJS + Socket.io 连接断开/重新连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9708604/

相关文章:

javascript - 带有 websocket 接口(interface)的数据库?

node.js - Googlecloud 的 pub/sub、socket、ipc 等的区别

node.js - sails 中的 Node js Passport-Facebook 策略身份验证

node.js - Mongodb Nodejs查询语法错误

mysql - node-mysql 池和 socket.io

javascript - Socket.io 发送到特定客户端

javascript - PubNub - 曾经有效但不再有效的代码

mysql - Sequelize 多对多关联连接表未填充

javascript - openshift/nodeJS 中的 Websocket 失败

javascript - 在 JavaScript 中异步创建独特的对象属性是否安全?