2013-02-07 3 views
0

socket.io 서버와 클라이언트가 올바르게 실행 중입니다. 서버가 다운 될 때마다 클라이언트는 5 초마다 다시 연결을 시도합니다. 서버가 다시 가동되면 문제없이 연결됩니다.시작시 node.io 서버가 충돌 함

하지만 서버가있을 때, 그것을 보여주는 충돌이 다시 서버를 백업하기 전에 오랜 시간을 기다릴 때 문제는 온다 :

info - socket.io started 
debug - client authorized 
info - handshake authorized DqN4t2YVP7NiqQi8zer9 
debug - setting request GET /socket.io/1/websocket/DqN4t2YVP7NiqQi8zer9 
debug - set heartbeat interval for client DqN4t2YVP7NiqQi8zer9 
debug - client authorized for 
debug - websocket writing 1:: 

buffer.js:287 
    pool = new SlowBuffer(Buffer.poolSize); 
     ^
RangeError: Maximum call stack size exceeded 

클라이언트 재 연결 (각 5 초 실행 된이 연결되어 있지 않을 때) :

서버 측에
function socket_connect() { 
    if (!socket) { 
     socket = io.connect('http://192.168.1.25:8088', { 'reconnect':false, 'connect timeout': 5000 }); 
    } else { 
     socket.socket.connect(); 
    } 
    socket.on("connect", function() { 
     clearInterval(connect_interval); 
     connect_interval = 0; 
     socket.emit('player', { refresh_data:true }); 
    }); 
} 

만 소켓 인스턴스, 그것은 충돌 :

var io = require('socket.io').listen(8088); 

나는이 문제가 다음과 같다고 생각한다 :

서버가 올라 오면 클라이언트가 5 초마다 (15 시간 동안 연결 해제 * 60m * 60 초/5 초 재 연결) 모든 클라이언트 연결을 수신하고 충돌합니다.

서버가 수행하려는 연결을 닫으려면 어떻게해야합니까?

PS : 나는 클라이언트를 다시로드하는 경우, 서버 최대 후에는 socket.io.js의 주요 아이디어는 기존의 연결을 재사용 할 수

+0

왜 수동으로 다시 연결하고 설정하는'재 연결 : FALSE ' ? – loganfsmyth

+0

원인을 각각 5 초마다 다시 연결하려고하고 socket.io 다시 연결 메서드가 다시 연결하려고합니다. 각각 (증분) 초 및 재 연결 제한이 있습니다. –

답변

0
내가 문제를 설립

...

기능 socket_connect이()는 "socket.on는 ("연결 호출 될 때마다 "..."기능이 생성됩니다. 따라서 서버가 켜지면, 새 연결이 만들어 지지만 이벤트 "socket.on (" "연결이

솔루션는 ... 여러 번 해고 :

function socket_connect() { 
    if (!socket) { 
     socket = io.connect('http://192.168.1.25:8088', { 'reconnect':false, 'connect timeout': 5000 }); 
    } else { 
     socket.socket.connect(); 
    } 
} 

socket.on("connect", function() { 
     clearInterval(connect_interval); 
     connect_interval = 0; 
     socket.emit('player', { refresh_data:true }); 
    }); 
1

입니다 작동합니다. 소켓을 연결 한 다음 socket.emit()을 사용하여 메시지를 교환해야합니다.

5 초마다 클라이언트와 서버 간의 새로운 연결을 만드는 이유가 확실하지 않습니다. 서버가 생성 할 수있는 연결 수에는 제한이 있지만 충분해야합니다. 루프에 넣으면 결국 서버의 소켓이 부족합니다.

io.connect는 클라이언트에서 한 번 실행해야하며 5 초마다 socket.emit()을 수행 할 수 있습니다. { 'reconnect': false, 'connect timeout': 5000}을 제거하면 문제가 없습니다.

+0

하지만 서버가 다운되었을 때만 새로운 연결을 실행하고 있습니다. 서버가 다시 연결될 때 연결 기능의 콜백이 중지됩니다. –

+0

이것은 연결 때문인 경우. 시도해보십시오 function socket_connect() { socket = io.connect ('http://192.168.1.25:8088', { '다시 연결': 'connect timeout': 5000}); socket.emit ('player', {refresh_data : true}); }}); } 출력을 제공하여 디버깅 할 수 있도록하십시오. – user568109

관련 문제