2012-05-31 5 views
0

나는 특급 3를 사용하여 만드는 앱 메신저에서 비공개 메시지를 구현하기 위해 노력하고있어 두 개의 클라이언트를 추가하고Socket.io 객실

클라이언트가 클라이언트 사용자 ID와 함께 방을 연결

가 자동으로 생성 및 가입되어 Socket.IO에 . 이것은 주로 알림 및 그런 종류의 것들입니다. 이제 개인 채팅을 위해이 작업을하려고합니다. 사용자가 보내기 단추를 클릭하면 보낸 사람의 사용자 ID (세션 사용자 ID에서)와 숨겨진 필드 또는 속성에서 소유자의 사용자 ID가 함께 전송됩니다 요소의 발신자는 소유자 userid 네임 스페이스로 회의실에 참여합니다. 이 문제는 발신자가 다른 페이지로 이동하거나 브라우저를 새로 고침 할 때 그 사람이 방에서 연결되어 있지 않으며 소유자로부터 더 이상의 메시지를받지 못한다는 것입니다. 그는 소유자 방에 다시 합류하기 위해 새 메시지를 보내야합니다. 이제 어떻게 소유자 방과의 연결을 퍼시스트합니까? 아니면 내가 잘못하고있는거야? 이것을 달성하기위한보다 나은 표준 방법이 있습니까?

SERVER :

io.on('connection', function (socket) { 
    var sh = socket.handshake; 

    socket.join(sh.session.userid); 

    socket.on('chat', function (data) { 
     if (data.user) { 
      socket.join(data.owner); 
     } 
     io.sockets.in(data.owner).emit('chat', 
      {user: sh.session.user, message: data.message}); 
    }); 
}); 

CLIENT :

var socket = io.connect('https://localhost/'); 

$('#send_message').click(function (e) { 
    socket.emit('chat',{message: $('.message').val(), 
     user:$('#user'), owner:$('#owner')} //Get this from hidden fields in chat form); 
    e.preventDefault(); 
}); 

socket.on('chat', function (data) { 
    $('ol').prepend('<li>' + data.user + '<br />' + data.message + '</li>'); 
}); 
+0

클라이언트가 기본적으로 서버에 다시 연결하지 않습니까? 기본적으로 사이트에 로그온하는 것과 사이트를 새로 고치는 것의 차이점은 무엇입니까? 동일한 코드가 두 번 모두 실행됩니다. 맞습니까? – Amberlamps

답변

2

오른쪽. 페이지를 다시로드하면 서버에서 "클라이언트 연결이 끊어졌습니다"라는 메시지가 표시되고 소켓 수신이 취소됩니다. 클라이언트는 비공개 피드로 돌아 가기 위해 (동일한 소유자 ID로) '채팅'메시지를 다시 보내야합니다.

한 가지 방법은 클라이언트가 쿠키에 소유자 ID를 저장하고 모든 페이지로드시이를 호출하는 것입니다. 또는 세션 쿠키 (http://www.senchalabs.org/connect/session.html)를 사용하여 서버 정보를 저장하고 리콜 할 수 있습니다.이 정보는 본질적으로 첫 번째 옵션과 같습니다.

+0

ok 그래서 socket.join (sh.session.rooms)으로 변경했습니다. 세션 데이터 룸 = data.owner를 설정하십시오. 그리고 나서 사용자가 연결되어있는 모든 방을 물체에 추가 할 수 있습니다. 감사 – georgesamper