2011-12-27 7 views
3

최소한의 예제를 작성했습니다. 코드는 여기에 게시됩니다 : https://gist.github.com/1524725NodeJS socket.io-client는 서버가 종료 될 때 'disconnect'또는 'close'이벤트를 발생시키지 않습니다.

클라이언트를 시작하고 두 클라이언트 간의 연결이 성공하는지 확인한 다음 마지막으로 CTRL + C를 사용하여 서버를 종료합니다. 서버가 종료되면 클라이언트는 즉시 완료까지 실행되고 on_client_close 또는 on_client_disconnect에 메시지를 인쇄하지 않고 닫힙니다. 지각 할 수있는 지연은 없습니다.

클라이언트 프로세스가 정상적으로 종료 중이기 때문에 제가 한 바에 따르면 STDOUT 버퍼가 플러시되지 않을 가능성은 없습니다.

서버 대신 클라이언트를 종료하면 서버가 예상대로 응답하여 on_ws_disconnect 함수가 실행되고 활성 클라이언트 목록에서 클라이언트 연결이 제거됩니다.

32 비트 우분투 11.10 Socket.io의 v0.8.7 Socket.io 클라이언트 v0.8.7 NodeJS v0.6.0

감사합니다!

--- 편집 ---

는 클라이언트와 서버는 Node.js를 처리하기보다는 기존의 웹 브라우저 클라이언트와 서버를 Node.js를있는 점에 유의하시기 바랍니다.

답변

5

NEW ANSWER 확실히

IO-클라이언트의 버그. :(

난 socket.io 클라이언트/libs와/socket.js을 수정함으로써이 문제를 해결할 수 있었다. 선 (433)의 주위에, 단순히 if (wasConnected) {this.publish('disconnect', reason); 이동.

Socket.prototype.onDisconnect = function (reason) { 
    var wasConnected = this.connected; 

    this.publish('disconnect', reason); 

    this.connected = false; 
    this.connecting = false; 
    this.open = false; 

    if (wasConnected) { 
     this.transport.close(); 
     this.transport.clearTimeouts(); 

CTRL + C를 누르면 , 연결 해제 메시지는 대략 십초 화재

OLD 토론

종료 이벤트의 클라이언트에 통지하려면 demo_server.js이 뭔가를 추가합니다. : (당신이 사용하는 명령 또는)

var logger = io.log; 

process.on('uncaughtException', function (err) { 
    if(io && io.socket) { 
    io.socket.broadcast.send({type: 'error', msg: err.toString(), stack: err.stack}); 
    } 
    logger.error(err); 
    logger.error(err.stack); 

    //todo should we have some default resetting (restart server?) 
    app.close(); 
    process.exit(-1); 
}); 

process.on('SIGHUP', function() { 
    logger.error('Got SIGHUP signal.'); 
    if(io && io.socket) { 
    io.socket.broadcast.send({type: 'error', msg: 'server disconnected with SIGHUP'}); 
    } 
    //todo what happens on a sighup?? 
    //todo if you're using upstart, just call restart node demo_server.js 
}); 

process.on('SIGTERM', function() { 
    logger.error('Shutting down.'); 
    if(io && io.socket) { 
    io.socket.broadcast.send({type: 'error', msg: 'server disconnected with SIGTERM'}); 
    } 
    app.close(); 
    process.exit(-1); 
}); 
당신이 broadcast.send에 보낼 것을 물론

, (...)는 환경 설정 및 클라이언트 구조에 따라 달라집니다. 서버 연결이 당신이 당신의 예에있는 ('분리', ...)를,에 사용하여 손실 된 경우 클라이언트 측에 대한

, 당신은 말할 수 :

client.on('disconnect', function(data) { 
    alert('disconnected from server; reconnecting...'); 
    // and so on... 
}); 
+0

이 매우 합리적이다,하지만 정말 내가 뭘 찾고 있어요. 서버가 자체적으로 치료할 기회없이 죽을 수있는 경우가 있습니다. 잡을 수없는 SIGKILL 신호 또는 전원 장애를 고려하십시오. 분명히 클라이언트 측은 서버가 완료 될 때까지 서버가 사라 졌음을 알고 있습니다. 클라이언트가 확실하게 콜백을 실행하여이 이벤트에서 특정 작업을 수행 할 수있게하려는 것입니다. 귀하의 의견을 주셔서 감사합니다! – zslayton

+0

그래서 클라이언트에서 서버 연결이 시간 초과되는지 여부를 확인하는 방법을 찾고 있습니까?나는 당신이 "disconnected"를 "disconnected"로 대체 할 필요가 있다고 생각합니다; 나는 이것을 어디에서 발견했는지 모르겠다. 내 노드 애플 리케이션에서 사용한다. (예제는 내 답변에 추가) – Kato

+0

또한, 클라이언트에게 자동으로 다시 연결하도록 지시 할 수 있다는 것을 잊지 마라. io_client.connect (url, {reconnect : true}); – Kato