저는 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>");
}
});
});
});
감사
다음은 관련 클라이언트 코드입니다.
나는 socket.io 자체가 처리하지한다고 생각하는 대신 개발자가 그것을 처리 .. 이상한. –
나는 chunked transfer encoding과 같은 것을 추측 할 수 있는데, "AJAX multipart streaming"이 확실하지 않은지 확실하지 않다면 –
이 문제는 모든 chat app가 socket.io로 실행되어야한다고 생각했지만, Google에서 그걸 찾은 것 같습니다. 이 문제를 해결하기위한 최선의 방법이 있지만 socket.io를 처음 사용합니다. – Mottokrosh