2014-12-07 77 views
1

我正在用Express和Socket.IO构建一个NodeJS应用程序,它指示客户端脚本根据特定条件将用户重定向到不同的页面。我遇到的问题是,当它重定向时,我得到另一个套接字连接。在我的代码中,我会根据套接字ID跟踪套接字会话,以便将消息发送到特定的套接字以对它们执行操作。由于重定向使用新的ID创建了一个新套接字,因此我不再能够实现此功能。如何防止页面重定向上的socket.io多重连接?

我试过在重定向之前断开一个套接字,在连接断开前一个套接字之后发送消息等。似乎没有任何东西可以让我轻松管理带重定向的单个套接字连接。

免责声明:我到节点,Socket.io等全新

这里是我的服务器代码:

var http = require('http'), 
    express = require('express'); 
var app  = express(); 
var server = http.createServer(app); 
var io  = require('socket.io')(server); 
var port = 8000; 

app.use(express.static(__dirname + '/public')); 

var activeClientId; 
var clientQ = []; 
var clients = {}; 
var numUsers = 0; 

function updateActive() { 
    console.log("Updating active client..."); 

    activeClientId = clientQ.shift(); 
    var active = clients[activeClientId]; 
    while (!checkActive() && clientQ.length > 0) { 
     if (typeof active !== 'undefined' && active !== null) { 
      delete clients[activeClientId]; 
      active.disconnect(); 
      console.log("Force Disconnect Client: " + activeClientId); 
      numUsers = Object.keys(clients).length; 
     } 

     activeClientId = clientQ.shift(); 
     active = clients[activeClientId]; 
    } 

    if (checkActive()) { 
     console.log("New Active Client: " + activeClientId); 
    } else { 
     console.log("Active Client Not Updated"); 
    } 
}; 

function checkActive() { 
    var active = clients[activeClientId]; 
    return typeof active !== 'undefined' && active !== null && active.connected; 
}; 

io.on('connection', function (socket) { 
    clients[socket.id] = socket; 
    clientQ.push(socket.id); 

    numUsers = Object.keys(clients).length; 

    console.log("Client " + "#" + numUsers + " connected: " + socket.id); 

    if (numUsers === 1) { 
     activeClientId = socket.id; 
    } else { 
     updateActive(); 
    } 

    if (socket.id === activeClientId) { 
     socket.emit('game'); 
    } else { 
     socket.emit('wait'); 
    } 

    socket.on('play', function() { 
     console.log("users: " + numUsers); 
     console.log("curId: " + socket.id); 
     console.log("actId: " + activeClientId); 

     if (socket.id !== activeClientId && numUsers > 1) { 
      socket.emit('kick'); 
     } else { 
      console.log("Game started on client: " + socket.id); 
     } 
    }); 

    socket.on('disconnect', function() { 
     console.log("Client " + "#" + numUsers + " disconnected: " + socket.id); 

     delete clients[socket.id]; 

     numUsers = Object.keys(clients).length; 

     updateActive(); 

     socket.broadcast.emit('disconnected', { 
      numUsers: numUsers 
     }); 
    }); 
}); 

server.listen(port, function() { 
    console.log('Listening on port: %d', port); 
}); 

而且我的客户:

$(function() { 
    var socket = io(); 

    socket.on('game', function (data) { 
     socket.disconnect(); 
     window.location.replace("/game"); 
    }); 

    socket.on('wait', function (data) { 
     socket.disconnect(); 
     window.location.replace("/wait"); 
    }); 
}); 

代码为/game页面:

$(function() { 
    var socket = io(); 

    socket.on('connect', function (data) { 
     socket.emit('play'); 
    }); 

    socket.on('kick', function(data) { 
     socket.disconnect(); 
     alert("KICK!"); 
     window.location.replace("/wait"); 
    }); 
}); 

\wait页面的代码:

$(function() { 
    var socket = io(); 

    socket.on('connect', function (data) { 
     socket.emit('wait'); 
    }); 

    socket.on('game', function (data) { 
     socket.disconnect(); 
     window.location.replace("/game"); 
    }); 
}); 
+0

每个新的网页都将是一个新的套接字连接,因为您无法在页面之间保留连接,所以如果您重定向到一个新的网页ge,您将丢失之前的套接字连接。你可以使用一个ID来cookie,并在重定向后重新连接时使用该ID。 – jfriend00 2014-12-07 23:57:06

+0

是的,这是有道理的。但是当我重定向时,如果连接不被保留,不应该为socket.io触发一个'disconnect'?它目前不是,这会导致我的连接会话阵列在每次重定向时保持不断增长。 – PseudoPsyche 2014-12-07 23:59:58

+0

如果您正在收听正确的事件,则应在服务器上发生断开连接事件。 – jfriend00 2014-12-08 00:24:35

回答

0

在客户端在IO添加一些选项()

{输送:[ '的WebSocket'],升级:假}

var socket = io('http://localhost:8000',{transports: ['websocket'], upgrade: false});