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");
});
});
每個新的網頁都將是一個新的套接字連接,因爲您無法在頁面之間保留連接,所以如果您重定向到一個新的網頁ge,您將丟失之前的套接字連接。你可以使用一個ID來cookie,並在重定向後重新連接時使用該ID。 – jfriend00 2014-12-07 23:57:06
是的,這是有道理的。但是當我重定向時,如果連接不被保留,不應該爲socket.io觸發一個'disconnect'?它目前不是,這會導致我的連接會話陣列在每次重定向時保持不斷增長。 – PseudoPsyche 2014-12-07 23:59:58
如果您正在收聽正確的事件,則應在服務器上發生斷開連接事件。 – jfriend00 2014-12-08 00:24:35