클라이언트 측 스크립트가 특정 조건에 따라 다른 페이지로 사용자를 리다이렉트하도록 지시하는 Express 및 Socket.IO가있는 NodeJS 앱을 구축 중입니다. 내가 가지고있는 문제는 그것이 리다이렉트 할 때, 나는 또 다른 소켓 연결을 얻는다는 것이다. 내 코드에서는 소켓 ID를 기반으로 소켓 세션을 추적하여 메시지를 특정 소켓으로 보내서 메시지를 처리합니다. 리디렉션은 새 ID로 새 소켓을 만들기 때문에 더 이상이 기능을 수행 할 수 없습니다.리디렉션 페이지에서 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");
});
});
나는 여기
내 서버 코드 등 노드, Socket.io에 완전히 새로운 해요 /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");
});
});
페이지마다 연결을 유지할 수 없기 때문에 모든 새로운 웹 페이지가 새로운 소켓 연결이됩니다. 따라서 새 PA로 리디렉션하는 경우 이전 소켓 연결이 끊어집니다. 브라우저에서 ID를 사용하여 쿠키를 만들 수 있으며 리디렉션 후 다시 연결할 때 해당 ID를 사용합니다. – jfriend00
그래, 그건 의미가있다. 하지만 리디렉션 할 때 연결이 유지되지 않으면 socket.io에 대해 '연결 해제'가 트리거되지 않아야합니다. 현재는 아니므로 연결된 각 세션의 배열이 각 리디렉션에서 계속 증가하고 있습니다. – PseudoPsyche
올바른 이벤트를 수신하는 경우 서버에 연결 해제 이벤트가 있어야합니다. – jfriend00