2012-10-21 4 views
3

xhr 폴링을 사용할 때 내 소켓 연결이 닫히지 않는 이유를 아는 사람이 있습니까? 이것은 실행하고 싶지만 xhr 폴링을 사용할 때 실행되지 않는 서버 코드입니다. 소켓 연결이 잘 작동합니다 (이 소켓은 보안 성이 뛰어나므로 스턴넬로 바니시 뒤에 있습니다). 브라우저 언로드시 끊어지는 이벤트를 수동으로 시도했지만 이것이 최적의 해결책은 아닙니다. 내 클라이언트 측 코드에서 XHR 폴링으로 소켓 연결 닫기

client.on('disconnect', function() { 

    delete connected_clients[id]; 
    console.log(' debug - ' + 'client ' + client.id + 'is disconnected'); 
    console.log(' debug - ' + 'total number of connected clients is ' + Object.keys(connected_clients).length);    

}); 

는,이 같은 소켓을 연결하고있다 :

socket = io.connect(BASE_URL, { 
    "sync disconnect on unload":true 
}); 

내 서버 측 설정은이 :

io.enable('browser client minification'); // send minified client 
    io.enable('browser client etag');   // apply etag caching logic based on version number 
    io.enable('browser client gzip');   // gzip the file 
    io.set('log level', 3);     // reduce logging 
    io.set('match origin protocol', true);  // ssl support 
    io.set('sync disconnect on unload', true); 
    io.set('transports', [      // enable all transports (optional if you want flashsocket) 
     'xhr-polling', 
     'websocket', 
     'flashsocket', 
     'htmlfile', 
     'jsonp-polling' 
    ]); 

이 내가 얻을 디버그 메시지입니다 클라이언트가 브라우저를 종료 할 때

debug: xhr-polling closed due to exceeded duration 

노드 0.8.8에서 socket.io 버전 0.9.10을 사용하고 있습니다.

답변

0

연결이 사용자 (서버)와 클라이언트 (브라우저) 사이에 있기 때문에 연결이 닫힐 때 알림을받는 것과 관련하여 브라우저를 사용하는 것이 좋습니다. 브라우저가 연결을 닫은 것으로 간주한다는 사실을 사용자에게 알리지 않으면 사용자에게 알릴 수있는 방법이 없습니다.

서버를 적절하게 처리하고 적절하게 버려진 연결을 알리는 방식으로 클라이언트를 프로그래밍하는 것이 좋습니다. 알림없이 연결이 단순히 무시되는 경우 일정 시간 동안 사용하지 않으면 (시간 초과) 연결을 종료하기 만하면됩니다.

인스턴트 메시지를 보낼 때와 같은 시나리오를 생각해보십시오. 친구가 책상을 떠나 더 이상 대화에 참석할 수 없거나 (통보없이) 책상을 떠나거나 (브라우저 프로세스를 중단 할 수 있음) 통보 할만큼 친절 할 수도 있고, 악화 될 수도 있습니다. 참석을 막을 수있는 심장 마비가있을 수 있습니다 (정전). 잠시 후에 더 이상 세션에 적극적으로 참여하지 않는다는 것을 알게 될 것입니다 (타임 아웃).

죄송합니다. 여기에는 마법이 없습니다. 연결이 끊어진 클라이언트와 대화 할 수 있다는 사실을 처리하기 위해 서버를 프로그래밍해야합니다.