4

我已经写了一个最小的例子。代码贴在这里:https ://gist.github.com/1524725

我启动我的服务器,启动我的客户端,验证两者之间的连接是否成功,最后用CTRL+C杀死服务器。当服务器死机时,客户端立即运行完成并关闭,而不在 on_client_close 或 on_client_disconnect 中打印消息。没有明显的延迟。

从我所做的阅读来看,因为客户端进程正常终止,所以不可能没有刷新 STDOUT 缓冲区。

还可能值得注意的是,当我杀死客户端而不是服务器时,服务器会按预期响应,触发 on_ws_disconnect 函数并从其活动客户端列表中删除客户端连接。

32 位 Ubuntu 11.10 Socket.io v0.8.7 Socket.io-client v0.8.7 NodeJS v0.6.0

谢谢!

- - 编辑 - -

请注意,客户端和服务器都是 Node.js 进程,而不是传统的 Web 浏览器客户端和 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 后,断开连接消息会在大约十秒内触发。

旧讨论

要通知客户端关闭事件,您可以在 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 回答