在客户端,当socket.on('disconnect')被触发时,会立即发送信号,但在服务端,需要一分钟时间才能发送信号。
场景1:如果客户端由于网络问题断开连接,则服务器端将在1分钟后发出disconnect信号。是否有方法在服务器端立即发现它的断开连接。
我试过更改pingTimeout=30000和pingInterval=12000,但每30秒它都会重新连接。
在客户端,当socket.on('disconnect')被触发时,会立即发送信号,但在服务端,需要一分钟时间才能发送信号。
场景1:如果客户端由于网络问题断开连接,则服务器端将在1分钟后发出disconnect信号。是否有方法在服务器端立即发现它的断开连接。
我试过更改pingTimeout=30000和pingInterval=12000,但每30秒它都会重新连接。
您可以使用超时延迟和套接字断开事件,使断开和重新连接更加容易。
当您的套接字连接时,将其添加到桶对象中。
if (socket.request.sessionID && !bucket[socket.request.sessionID]) {
bucket[socket.request.session.player.id] = socket.id; //nuuu they stealin mah bukkit
}
这将通过绑定到套接字的节点会话来添加播放器的ID作为socketId的键。
//object for delayed log out
let disconnection = {
sid : null, //socket id
delay : null //timeout id
};
socket.on('disconnect', function () {
disconnection.sid = socket.request.sessionID; //grab session id
disconnection.delay = setTimeout(() => {
//set timeout to variable, in case of reconnection
delete bucket[socket.request.sessionID];
//emit the disconnection event
}, 60000);
});
当用户断开连接时,设置一个超时时间,让他们在规定时间内重新连接。
重新连接后,只需简单地执行以下操作:
io.sockets.on("connection", socket => {
//check for disconnection, compare socket ids, and remove timeout if sockets match
if (disconnection.delay && disconnection.sid == socket.request.sessionID) {
clearTimeout(disconnection.delay);
disconnection.sid = null;
}
});
此代码将检查现有socketID的重新连接并清除超时,成功地再次建立连接。
请注意,此代码是SourceUndead(我的游戏)的副本,因此其中的一些内容可能无法直接对您进行翻译(例如,我的socket变量也与会话绑定),但超时断开连接的概念是相同的。
bucket.push()
来存储每次用户连接时的 socketID(clientID),对吧?为了帮助我们的朋友避免混淆,将这个小提示加入可能会很有帮助。 - sova