2012-05-07 2 views
10

이 가이드를 따라 : express.js를 socket.io에 연결하기 위해 http://www.danielbaulig.de/socket-ioexpress/을 수행했으며 훌륭하게 작동합니다.동일한 사용자로부터 여러 socket.io 연결을 감지하는 방법

사용자가 한 페이지 (세션 객체를 설정하는 express.js POST 요청)에 로그인하고 인증 한 경우 socket.io가로드되고 서버 socket.io가로드 할 수있는 새 페이지로 사용자를 안내합니다. 익스프레스에서 설정 한 세션을 잡아. 그래서 모든 것이 잘 작동합니다.

이제 socket.io를 사용하는 페이지를 새로 고칠 때 사용자가 페이지를 새로 고칠 때가 있습니다. socket.io 연결이 여전히 존재하는 경우가 있습니다 (즉, 연결이 끊어지지 않음). 내가 뭘 하려는지 io.set('authorization') 함수를 변경하여 사용자가 연결할 때 해당 클라이언트에 아직 열려있는 모든 기존 socket.io 인스턴스의 연결을 끊습니다. 여기

는 순간에 보이는 방법이다 인정하는 것입니다 클라이언트가 이전 연결되어 있다면 확인하려면 어떻게

//socket.io connect to express 
var parseCookie = require('connect').utils.parseCookie; 
io.set('authorization', function (data, accept) { 
    if (data.headers.cookie) 
    { 
     data.cookie = parseCookie(data.headers.cookie); 
     data.sessionID = data.cookie['express.sid']; 
     // (literally) get the session data from the session store 
     sessionStore.get(data.sessionID, function (err, session) 
     { 
      if (err || !session) 
      { 
       // if we cannot grab a session, turn down the connection 
       //note: a session is created when the user logs in 
       accept('Error', false); 
      } 
      else 
      { 
       //TODO something here before we accept the connection 
       //?? 

       // save the session data 
       data.session = session; 
       //accept the connection 
       accept(null, true); 
      } 
     }); 
    } 
    else 
    { 
     return accept('No cookie transmitted.', false); 
    } 
}); 

, 그것은 여전히 ​​열려 있습니다 (따라서 우리는 필요 그 오래된 것을 분리하십시오).

익스프레스 세션에 "username"이 있습니다. 세션 개체를 가져 와서 사용자 이름을 얻을 수 있기 때문에 모든 socket.io 클라이언트 목록을 확인하는 방법을 알지 못합니다. 각각에 대한 특급 세션을보고 현재 인증하는 사용자와 동일한 지 확인하십시오.

답변

6

제 응용 프로그램에서는 socket.io 세션을 명시 적으로 관리합니다. 서버 측에서는 새로운 연결이 설정 될 때마다 다음과 같이합니다 : socketio_session[user_id].push(session). 이렇게하면 특정 사용자에 대해 연결된 모든 세션에 대한 액세스 권한이 부여됩니다. 귀하의 경우, 사용자 당 세션 목록을 저장할 필요는 없지만 최신 세션 만 저장하고 새 세션을 저장하기 전에 기존 세션에 대해 강제로 연결을 끊어야합니다 (있는 경우).

+0

네, 가장 쉬운 옵션입니다. 글로벌 socket.io 변수를 사용하는 방법이 있어야합니다. – Andrew

+0

TornadIO2를 사용합니다.이 경우에는 그런 일을 위해 내장 된 방법이 없습니다 (소스 코드를 한 라인 씩 찾음). 하지만 Node.js를 socket.io와 함께 서버에서 사용한다면 확실하지 않습니다. –

+0

네,이 일이 가장 쉬운 방법 인 것처럼 보입니다. 배열에 모든 연결을 저장하고 있으므로 액세스 할 수 있습니다 ... 건배. – Andrew

0

Socket.IO에 많은 코드가 있습니다.

새로운 문서 (Socket.IO 1.3.6, 지금은) 말한다 :

"오래된 io.set()와 io.get() 메소드가 사용되지 않는, 하위 호환성을 위해 지원됩니다 여기에. 미들웨어에 예전의 허가 구식을 번역 한 것입니다. " "0.9에서 마이그레이션"절의

새 버전의 Socket.IO를 사용하는 경우. 필요한 코드는 다음과 같습니다.

관련 문제