奇怪的行为与套接字时重新启动节点 – 任何想法?

我写了一个简单的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 ),并重新启动它,连接握手得到logging,并且服务器总是发出一个“连接”,但当客户端跟随,并发出一个“联合空间”接收连接服务器没有收到它(我正在做一个console.log接收join室。)

但是,如果我在发出“join会议室”之前发出了一个客户端警报(本质上是强制延迟),则代码将始终有效。 当客户端发送“join空间”事件时,服务器是否可能没有完全初始化?

在这里有很多事情可能会出错,但是首先,您可以尝试收听有关重新连接的客户端事件。

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

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

(理论从来没有真正遇到过这个)

那么当应用程序停止时,可能会有不当行为,并且您正在使用Redis存储会话,重新启动应用程序,并且会话仍然可用。要解决此类问题

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

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