2012-04-30 3 views
3

Node (Express) 및 Socket.IO에 채팅 기능이있는 웹 응용 프로그램을 구축하고 있습니다. 페이지에 새 탭을 열면 새로운 소켓 연결이 설정되므로 익스프레스 세션 ID를 기반으로 단일 사용자의 모든 인스턴스를 자신의 방에 그룹화하여 해당 사용자를 겨냥한 모든 메시지를 모든 중복 탭에 표시 할 수 있어야합니다. 이것은 이미 로그인 한 다른 방/채널에 추가됩니다. 최소한 사용자는 두 개의 대화방, 즉 실제 "실제"방과 sessionID를 사용하는 자체 채널에 가입합니다.Socket.IO를 사용하여 Room/Channel의 하위 사용자에게 보내기

문제는 내 sessionID의 모든 소켓이 일반 룸에 있고 다른 사용자의 메시지를 받아야한다는 것입니다. 내가 일반적인 채팅 메시지를 보낼 때 그들은 이미 자신의 채널을 통해 메시지를받은 것처럼 보내는 사용자에게 해당하는 소켓을 생략하고 싶습니다. 나는 앞서 가서 세션 ID를 키로하여 해당 세션에 대한 socketID 목록을 포함하는 배열의 해시를 만들었습니다. 예외 목록을 지정하기위한 몇 가지 구문을 보았지만 아무 것도 저에게 효과가없는 것 같습니다. 간결함을 위해 생략 특정 부분에

관련 코드

:

var sessionSockets = {}; 
io.sockets.on('connection', function(socket){ 
    if(!io.sockets.manager.rooms["/" + sessionID]) { 
     sessionSockets[sessionID] = []; 
     //send message indicating log on to all sockets except for my session 
    } 
    socket.join(sessionID); //create private channel for all sockets of the same sessionID 
    sessionSockets[sessionID].push(socket.id); 
    socket.on('chat', function(data){ 
     var payload = { 
      message: data.msg, 
      from: data.user 
     }; 

     //send back as personal message to all sockets for this session 
     io.sockets.in(sessionID).emit('me',payload); 

     //send to everyone else as regular message; WHAT SYNTAX? 
     io.sockets.in('').except(sessionSockets[sessionID]).emit('chat', payload); 
    } 
} 

TL; DR : 내가 수동으로 배열의 비교를하지 않고 채널/방에 일부 사용자에게 메시지를 보낼 수 있습니까?

+0

에 perticular 예를 방출 할 수있는 방법인가? 왜 그냥 원래 소켓이 아닌 모든 소켓에 브로드 캐스팅하지 않는 것인가? 당신이 가지고있는 모든 다른 탭이이 방법으로 예상대로 메시지를받을 것입니다. – slacktracer

답변

0

socket.join ('room')을 사용하고 socket.in (socket.room) .broadcast.emit을 사용하여 방으로 내 보낸다.

이 왜 먼저 자신에게 메시지를 보낼 당신이 방에있는 그룹의 클라이언트와 방

관련 문제