Javascript Socket.io随机断开连接(v1.0.6)

Javascript Socket.io随机断开连接(v1.0.6),javascript,node.js,sockets,websocket,socket.io,Javascript,Node.js,Sockets,Websocket,Socket.io,我正在使用最新版本的socket.io(1.0.6)制作一个带有Phaser和Node的在线多人游戏。我的问题是,一旦客户机连接起来,他们偶尔会随机断开连接。似乎没有发生这种情况的具体案例。有时是在游戏完全空闲时,有时是在所有玩家向服务器发送输入时 通过检查socket.io的调试输出,我发现断开连接的原因是“ping超时”。具体地说,将从socket.js库文件中激发以下行: Socket.prototype.setPingTimeout = function () { var self

我正在使用最新版本的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);
};
客户:

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

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

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

debug-设置请求GET/socket.io/1/jsonp polling/487577450665437510?t=1312872393095&i=1
调试-设置轮询超时
调试-清除轮询超时
debug-jsonppolling编写io.j[1](“7:::1+0”);
调试-为客户端487577450665437510设置关闭超时
警告-客户端未握手客户端应重新连接
信息-传输端
调试-清除客户端487577450665437510的关闭超时
调试-丢弃传输
调试-设置请求GET/socket.io/1/xhr-polling/487577450665437510
调试-设置轮询超时
调试-清除轮询超时
调试-xhr轮询写入7:::1+0
调试-为客户端487577450665437510设置关闭超时
警告-客户端未握手客户端应重新连接
信息-传输端
调试-清除客户端487577450665437510的关闭超时
调试-丢弃传输
调试-设置请求GET/socket.io/1/jsonp polling/487577450665437510?t=1312872393150&i=1
调试-设置轮询超时
调试-清除轮询超时
debug-jsonppolling编写io.j[1](“7:::1+0”);
调试-为客户端487577450665437510设置关闭超时
警告-客户端未握手客户端应重新连接
信息-传输端
调试-清除客户端487577450665437510的关闭超时
调试-丢弃传输
调试-设置请求GET/socket.io/1/xhr-polling/487577450665437510
调试-设置轮询超时
调试-清除轮询超时
调试-xhr轮询写入7:::1+0
调试-为客户端487577450665437510设置关闭超时
警告-客户端未握手客户端应重新连接
不幸的是,您不能使用socket.io修改ping间隔,如果您使用核心库(engine.io),则可以修改ping间隔


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

传递给socket.io的相同选项始终传递给创建的engine.io服务器

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

require('socket.io').listen(应用程序,{pingTimeout:4000,pingInterval:4000})


你必须再调试一下。可能是由于游戏逻辑错误导致某些玩家的websocket连接被破坏。错误可能在服务器或客户端上。若在客户机上,服务器将无法再访问它。也调试客户端逻辑。在加载socket.io之前,请尝试设置
localStorage.Debug='*'
。我发现我的客户端正在断开连接,因为其中一个处理程序抛出了一个socket.io在内部捕获的错误,然后为您重新连接,而实际上没有将错误抛出控制台。我遇到了相同的问题。你找到答案了吗?好吧,你能给我们举个有效的例子吗?或者至少是源代码?我遇到了另一个问题,websocket连接但不发送数据,然后在尝试发送数据后,它会刷新所有数据!有什么解决办法吗?这是可能的。我建议不要告诉别人,当你不知道答案时,有些事情是不可能的。require('socket.io').listen(应用程序,{pingTimeout:4000,pingInterval:4000});
var socket = io();
//client side listeners, emissions back to server