4

私はこれの最小限の例を書きました。コードはここに投稿されています:https ://gist.github.com/1524725

サーバーを起動し、クライアントを起動して、2つの間の接続が成功していることを確認し、最後にCTRL+Cでサーバーを強制終了します。サーバーが停止すると、クライアントはすぐに完了まで実行され、on_client_closeまたはon_client_disconnectのいずれにもメッセージを出力せずに閉じます。知覚できる遅延はありません。

私が行った読み取りから、クライアントプロセスは正常に終了しているため、STDOUTバッファがフラッシュされていない可能性はありません。

サーバーではなくクライアントを強制終了すると、サーバーが期待どおりに応答し、on_ws_disconnect関数を起動して、アクティブなクライアントのリストからクライアント接続を削除することにも注意してください。

32ビットUbuntu11.10Socket.io v0.8.7 Socket.io-client v0.8.7 NodeJS v0.6.0

ありがとう!

- - 編集 - -

クライアントとサーバーの両方が、従来のWebブラウザークライアントとnode.jsサーバーではなく、Node.jsプロセスであることに注意してください。

4

1 に答える 1

5

新しい答え

間違いなく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...
});
于 2011-12-27T20:17:19.060 に答える