이 문제가 발생할 수있는 다른 사람들을 돕기 위해 서버가 소켓이 비어있을 때만 서버가 데이터를 게시 할 수 있도록 잠금 시스템을 고안했습니다.
이것은 서버가 가능한 빨리 게시된다는 것을 의미합니다. 즉, 나가는 데이터 요청을 여러 개 스택하지 않습니다. 메시지가 버려지고 최신 정보가 필요한 경우에만 유효합니다. 또한 클라이언트가 서버에 알릴 필요가 있으므로 메시지 사이에 약간의 오버 헤드가 있음을 의미합니다.
그러나 이는 내 응용 프로그램이 최신 상태를 유지하며 요청이 겹쳐서 발생하지 않는다는 것을 의미합니다. 이는 한 브라우저를 로컬로 실행하고 네트워크를 통해 실행 한 경우에 두드러졌습니다.
Server.js
var socket = ...; // Create socket
// Create my data, in my project this updates very quickly
// roughly 60 times per second
var my_data = ...;
// Initially set receiving to false as the socket
// has no outgoing data
socket.set('receiving', false);
// Listen for received event, this indicates
// that the client has received an update
// and is now ready to receive more
socket.on('received', function() {
socket.set('receiving', false);
});
// Function will be called repeatedly to send out data
function update() {
// Check if the socket is receiving any data
socket.get('receiving', function(receiving) {
if(!receiving) {
// Lock the socket from receiving future updates
// by setting the receiving variable to true
socket.set('receiving', true, function() {
// Now emit data
socket.emit('update', my_data);
});
}
});
setTimeout(update, 0); // Recursively call update
}
setTimeout(update, 0); // Start update
Client.js는
var socket = io.connect();
socket.on('update', function(data) {
// Store the data for processing
// Tell the server we have received the data
socket.emit('received');
});
나는 이것이 올바른 생각하지 말아. 나는 휘발성으로 테스트했지만 아무런 영향을 미치지 않는 것으로 보인다. 브라우저가 수신 할 수 있도록 데이터가 계속 대기 중입니다. 이 경우에는 실패한 메시지 시도에 대해서만 데이터를 다시 보내려고 시도하지 않습니다. 나는 메시지 수명과 같은 것이 필요하지만 문서에서 아무것도 찾을 수 없기 때문에 그것이 존재하지 않는다고 가정하고있다. – fungus1487
메시지를 삭제할 수있는 유일한 곳은 클라이언트와 서버입니다. 타임 스탬프가 포함 된 메시지를 보낼 경우에도 클라이언트는 메시지를 삭제해야합니다. 그렇습니다. 구현되지 않았습니다. – hexacyanide
나는 클라이언트가 주기적으로 메시지 번호를 전송하는 경로를 가야 할 것이라고 생각한다. (이 메시지가 지나치게 멀리 떨어져있는 경우 각 메시지와 함께 전달되는 번호가 증가한다) 서버에서 일부를 건너 뛸 수 없다. . 이상적이지는 않지만 여전히 socket.io를 사용하면서 이것이 유일한 방법 일 수 있다고 생각합니다. – fungus1487