Node.js 重新启动节点时套接字的奇怪行为-有什么想法吗?

Node.js 重新启动节点时套接字的奇怪行为-有什么想法吗?,node.js,sockets,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('s

我已经编写了一个简单的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);
  });
}
我的服务器端代码如下所示:

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)并重新启动它时,连接握手会被记录下来,服务器总是会发出“连接”,但当客户端也这样做并在收到连接后发出“连接室”时,服务器不会收到它(我在接收连接室时执行console.log)


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

此处可能会出现一些问题,但首先您可以尝试收听有关重新连接的客户端事件

客户端代码,用于在重新连接时侦听

socket.on('reconnecting',function(){ 
 socket.emit('join room','lobby');
});
(理论上从未遇到过这种情况)

然后,当应用程序停止,并且您使用Redis存储会话,重新启动应用程序,会话仍然可用时,可能会出现错误行为。。解决这样一个问题

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

或者,当应用程序启动时,请确保它清理了会话存储,然后继续运行。

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

客户端代码,用于在重新连接时侦听

socket.on('reconnecting',function(){ 
 socket.emit('join room','lobby');
});
(理论上从未遇到过这种情况)

然后,当应用程序停止,并且您使用Redis存储会话,重新启动应用程序,会话仍然可用时,可能会出现错误行为。。解决这样一个问题

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

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

特别奇怪的是,如果我添加了警报(“此处”);在发出“join room”之前发送客户端代码,警报总是会触发,代码总是有效的,但是当我删除警报时,它并不总是有效的。这是否意味着这是一个时间问题?在没有警报的情况下,emit会很快启动?有人有什么好主意吗?特别奇怪的是,如果我添加了警报(“此处”);在发出“join room”之前发送客户端代码,警报总是会触发,代码总是有效的,但是当我删除警报时,它并不总是有效的。这是否意味着这是一个时间问题?在没有警报的情况下,发射太快了?有人有什么好主意吗?我更新了我的问题。事实证明,服务器总是发出“connect”事件,但是,当客户端发出“join room”时,服务器并不总是确认它。我想知道服务器是否没有机会初始化或其他什么?我更新了我的问题。事实证明,服务器总是发出“connect”事件,但是,当客户端发出“join room”时,服务器并不总是确认它。我想知道服务器是否还没有初始化的机会?