【发布时间】: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