2012-03-02 2 views
3

저는 Node.js와 Socket.IO로 멀티 룸 채팅 앱을 만들고 있어요. 전송이 xhr 폴링 일 때 세션 기간 동안 지속되어야하는 데이터를 처리하는 방법이 궁금합니다.xhr 폴링을 사용하여 영구 데이터를 Socket.IO에 저장하려면 어떻게해야합니까?

현재 클라이언트에서는 연결시 "join"이벤트를 보내는데,이 이벤트는 사용자 이름과 같은 몇 개의 변수를 전달하며 Socket.IO의 get 및 set 메서드를 사용하여 서버 측을 저장합니다. 그런 다음 클라이언트가 연결을 끊을 때까지 사용할 수 있습니다.

전송이 웹 소켓 인 경우 제대로 작동하지만 xhr 폴링으로 폴백하는 경우 5-10 초마다 발생하는 각 연결에서 가입 이벤트가 발생합니다. (마찬가지로 "그와 같은 것이 방을 떠났거나/참여했다"는 것은 바람직하지 않은 각 xhr-poll 요청에서 보내집니다.)

나는 앞으로 나아갈 수있는 최선의 방법이 무엇인지 잘 모르겠습니다. 나는 xhr-polling을 비활성화 할 수 없다.

socket.on("connect", function(){ 
    socket.emit("join", { username: username, room: room }); 
}); 

그리고 서버 : 사전에

var io = require("socket.io").listen(8124) 
, buffer = {} 
, max_room_buffer = 15; 

io.sockets.on("connection", function(socket) { 
    socket.on("join", function(data){ 
     if(data.username && data.room) { 
     socket.set("data", data); 
     socket.join(data.room); 
     if(!buffer[data.room]) buffer[data.room] = []; 
     socket.broadcast.to(data.room).emit("message", "<em>" + data.username + " has joined room " + data.room + "</em>"); 
     socket.emit("message", "<em>You have joined room " + data.room + "</em>"); 
     socket.emit("message", buffer[data.room]); 
    } 
}); 

socket.on("message", function(message) { 
    if(message) { 
     socket.get("data", function(err, data){ 
      if(data) { 
       var msg = "<span>" + data.username + ":</span> " + message; 
       buffer[data.room].push(msg); 
       if(buffer[data.room].length > max_room_buffer) buffer[data.room].shift(); 
       io.sockets.in(data.room).emit("message", msg); 
      } 
     }); 
    } 
}); 

socket.on("disconnect", function() { 
    socket.get("data", function(err, data){ 
     if(data) { 
      socket.leave(data.room); 
      socket.broadcast.to(data.room).emit("message", "<em>" + data.username + " has left room " + data.room + "</em>"); 
     } 
    }); 
}); 

}); 

감사

다음은 관련 클라이언트 코드입니다.

+0

나는 socket.io 자체가 처리하지한다고 생각하는 대신 개발자가 그것을 처리 .. 이상한. –

+0

나는 chunked transfer encoding과 같은 것을 추측 할 수 있는데, "AJAX multipart streaming"이 확실하지 않은지 확실하지 않다면 –

+0

이 문제는 모든 chat app가 socket.io로 실행되어야한다고 생각했지만, Google에서 그걸 찾은 것 같습니다. 이 문제를 해결하기위한 최선의 방법이 있지만 socket.io를 처음 사용합니다. – Mottokrosh

답변

2

아마 내가 누락되었지만 작동하지 않을 것입니다.

클라이언트 :

var firstJoin = true; 
socket.on("connect", function(){ 
    socket.emit("join", { username: username, room: room, firstJoin: firstJoin }); 
    firstJoin = false; 
}); 

서버 : 연결 이벤트가이 XHR 폴링의 피할 수없는 결과이다, 모든 새로운 설문 조사에 발생한다는 사실에 관해서는

io.sockets.on("connection", function(socket) { 
    socket.on("join", function(data){ 
     if(data.username && data.room) { 
     socket.set("data", data); 
     socket.join(data.room); 
     if(!buffer[data.room]) buffer[data.room] = []; 

     if (data.firstJoin) { 
      socket.broadcast.to(data.room).emit("message", "<em>" + data.username + " has joined room " + data.room + "</em>"); 
      socket.emit("message", "<em>You have joined room " + data.room + "</em>"); 
      socket.emit("message", buffer[data.room]); 
     } 
    } 
}); 

. 각 폴링은 새로운 HTTP 요청이므로 이전 요청의 상태가 없기 때문에 다시 설정해야합니다. 당신은 이런 일이 발생하는 빈도를 줄이려면

, 당신은 예를 들어 (20)의 기본에서 폴링 기간을 늘려보십시오 수 :

io.configure(function() { 
    io.set('polling duration', 60); 
}); 
+0

문제의 일부를 처리하는 것처럼 보입니다. 클라이언트가 일정 시간 동안 ping을하지 않으면 이벤트를 발생시킬 수있는 방법이없는 한 사용자가 실제로 연결을 끊으면 예고없이 살아야합니다. – Mottokrosh

+0

그래, 그게 해결하기 쉬운 문제가 아니야. 이론적으로 단절 이벤트는 잠시 후에 발생해야합니다 (기본 'close timeout'은 25 초라고 생각합니다), 지연이있을 수 있습니다 : http://stackoverflow.com/questions/6280569/socket-io-xhr-polling -delay-on-disconnection –

+0

감사합니다. Rohan, 그 스레드를 체크 아웃하겠습니다. 나는 당신의 대답을 upvote 싶지만 새로운 사용자로서 나는 아직 충분한 평판을 가지고 있지 않다! – Mottokrosh

관련 문제