新しい答え
間違いなくio-clientのバグです。:(
socket.io-client / libs/socket.jsを変更することでこれを修正することができました。433行目あたりで、this.publish('disconnect', reason);
上記を移動しただけif (wasConnected) {
です。
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キーを押すと、切断メッセージが約10秒で表示されます。
古い議論
シャットダウンイベントをクライアントに通知するには、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(...)で送信する内容(またはそこで使用するコマンド)は、設定とクライアント構造によって異なります。
クライアント側の場合、例にあるon('disconnect'、...)を使用して、サーバー接続が失われたかどうかを確認できます。
client.on('disconnect', function(data) {
alert('disconnected from server; reconnecting...');
// and so on...
});