【问题标题】:Socket.io Random Disconnects (v1.0.6)Socket.io 随机断开连接 (v1.0.6)
【发布时间】:2014-10-13 16:20:19
【问题描述】:

我正在使用最新版本的 socket.io (1.0.6) 使用 Phaser 和 Node 制作在线多人游戏。我的问题是,一旦客户端连接,他们偶尔会随机断开连接。似乎没有发生这种情况的特定情况。有时是在游戏完全空闲时,有时是在所有玩家向服务器发送输入时。

通过检查 socket.io 的调试输出,我发现断开连接的原因是“ping 超时”。具体来说,从 socket.js 库文件中触发了以下行:

Socket.prototype.setPingTimeout = function () {
  var self = this;
  clearTimeout(self.pingTimeoutTimer);
  self.pingTimeoutTimer = setTimeout(function () {
    self.onClose('ping timeout'); // <------------------------
  }, self.server.pingInterval + self.server.pingTimeout);
};

发生这种情况是有原因的吗?我只是在本地主机上测试我的服务器,所以我没有理由认为会有任何明显的延迟导致超时。我的套接字设置符合 socket.io 网站上的聊天应用示例:

服务器:

//http server setup
var io = require('socket.io')(http);
io.on('connection', function(socket){
  //Game logic,socket listeners, io.emits
});

客户:

var socket = io();
//client side listeners, emissions back to server

我的问题首先是我会间歇性地获得 ping 超时的可能原因是什么?其次,我有什么办法可以将超时时间设置得更长/更短,以测试这如何影响我获得的断开连接的频率?

【问题讨论】:

  • 你必须再调试一下。可能是由于游戏逻辑错误,某些玩家的 websocket 连接被终止。错误可能在服务器或客户端上。如果在客户端上,服务器将无法再访问它。也调试客户端逻辑。
  • 在加载 socket.io 之前尝试设置localStorage.debug='*'。我发现我的客户端正在断开连接,因为其中一个处理程序抛出了 socket.io 在内部捕获的错误,然后为您重新连接,而实际上没有将错误抛出到控制台。
  • 我遇到了同样的问题。你找到答案了吗?
  • 好吧,你能给我们举个例子吗?或者至少是源代码?
  • 我遇到了一个不同的问题,websocket 连接但不发送数据,然后在尝试发送数据后,它会刷新所有数据!有什么解决办法吗?

标签: javascript node.js sockets websocket socket.io


【解决方案1】:

你在你的控制台里得到这个吗,

debug - setting request GET /socket.io/1/jsonp-polling/487577450665437510?t=1312872393095&i=1
debug - setting poll timeout
debug - clearing poll timeout
debug - jsonppolling writing io.j[1]("7:::1+0");
debug - set close timeout for client 487577450665437510
warn  - client not handshaken client should reconnect
info  - transport end
debug - cleared close timeout for client 487577450665437510
debug - discarding transport
debug - setting request GET /socket.io/1/xhr-polling/487577450665437510
debug - setting poll timeout
debug - clearing poll timeout
debug - xhr-polling writing 7:::1+0
debug - set close timeout for client 487577450665437510
warn  - client not handshaken client should reconnect
info  - transport end
debug - cleared close timeout for client 487577450665437510
debug - discarding transport
debug - setting request GET /socket.io/1/jsonp-polling/487577450665437510?t=1312872393150&i=1
debug - setting poll timeout
debug - clearing poll timeout
debug - jsonppolling writing io.j[1]("7:::1+0");
debug - set close timeout for client 487577450665437510
warn  - client not handshaken client should reconnect
info  - transport end
debug - cleared close timeout for client 487577450665437510
debug - discarding transport
debug - setting request GET /socket.io/1/xhr-polling/487577450665437510
debug - setting poll timeout
debug - clearing poll timeout
debug - xhr-polling writing 7:::1+0
debug - set close timeout for client 487577450665437510
warn  - client not handshaken client should reconnect

https://github.com/Automattic/socket.io/wiki/Configuring-Socket.IO

【讨论】:

    【解决方案2】:

    很遗憾,您无法使用 socket.io 修改 ping 间隔,如果您使用核心库 (engine.io) 则可以。


    感谢 Paweł Wszoła 指出正确答案。根据 socket.io 上的文档:

    传递给 socket.io 的相同选项总是传递给创建的 engine.io 服务器。

    因此您可以通过将它们作为参数传递来设置引擎的 ping 超时和间隔。

    require('socket.io').listen(app, { pingTimeout: 4000, pingInterval: 4000 });

    【讨论】:

    • 有可能。当你不知道答案时,我建议不要告诉人们某事是不可能的。 require('socket.io').listen(app, { pingTimeout: 4000, pingInterval: 4000 });
    猜你喜欢
    • 2014-01-13
    • 2017-11-21
    • 2019-04-16
    • 2023-04-07
    • 2021-12-19
    • 2012-11-09
    • 1970-01-01
    • 2017-07-17
    • 2016-07-08
    相关资源
    最近更新 更多