2014-12-07 4 views
1

클라이언트 측 스크립트가 특정 조건에 따라 다른 페이지로 사용자를 리다이렉트하도록 지시하는 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"); 
    }); 
}); 
+0

페이지마다 연결을 유지할 수 없기 때문에 모든 새로운 웹 페이지가 새로운 소켓 연결이됩니다. 따라서 새 PA로 리디렉션하는 경우 이전 소켓 연결이 끊어집니다. 브라우저에서 ID를 사용하여 쿠키를 만들 수 있으며 리디렉션 후 다시 연결할 때 해당 ID를 사용합니다. – jfriend00

+0

그래, 그건 의미가있다. 하지만 리디렉션 할 때 연결이 유지되지 않으면 socket.io에 대해 '연결 해제'가 트리거되지 않아야합니다. 현재는 아니므로 연결된 각 세션의 배열이 각 리디렉션에서 계속 증가하고 있습니다. – PseudoPsyche

+0

올바른 이벤트를 수신하는 경우 서버에 연결 해제 이벤트가 있어야합니다. – jfriend00

답변

0

이 (IO 일부 옵션을 추가)

{전송 : [ '웹 소켓'] 업그레이드 : 거짓}

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