重启节点时套接字的奇怪行为 - 任何想法?

时间:2013-09-29 18:33:37

标签: node.js sockets

我写了一个简单的node.js / socket.io / express / redis服务器。当我杀死并重新启动服务器时,我正试图让客户端重新初始化。

我的客户端代码如下所示:

var socket = io.connect('http://' + location.hostname); 
socket.on('connect', function (data) {socket.emit('join room', 'lobby' );});

我的服务器端代码如下所示:

var SessionSockets = require('session.socket.io')
  , sessionSockets = new SessionSockets(io, sessionStore, cookieParser);

sessionSockets.on('connection', function (err, socket, session) {
    clientConnect(err, socket, session)
});

function clientConnect(err, socket, session){
  socket.on('join room', function (room) {
    if (room == 'lobby')
      lobby.connect(err,socket,session);
  });
}

编辑: 出于某种原因,当我终止服务器( ctrl + c )并重新启动它时,会记录连接握手,并且服务器总是发出'connect'但是当客户端接下来并在收到连接时发出“加入房间”,服务器没有收到它(我在接收连接房间时正在做一个console.log。)

但是,如果我在发出'join room'之前发出客户端警报(主要是强制延迟),那么代码总是有效。当客户端发送“加入会议室”事件时,服务器是否可能尚未完全初始化?

1 个答案:

答案 0 :(得分:1)

这里可能会出现许多问题,但首先您可以尝试收听有关重新连接的客户事件..

客户端代码,重新连接时监听

socket.on('reconnecting',function(){ 
 socket.emit('join room','lobby');
});

(一种理论从未真正遇到过这种情况)

然后,当应用程序停止时,可能会出现不当行为,并且您正在使用Redis存储会话,重新启动应用程序,并且会话仍然可用..以解决此类问题

process.on("SIGINT",function(){
 // clean up
});

或应用程序启动时确保它清理会话存储,然后继续..