Sockets 它';是否可以使用ack实现socket.io,如果服务器未收到ack,服务器是否会再次尝试发出该事件?
可以使用ack实现socket.io,如果服务器没有收到ack,服务器将再次尝试发出事件?socket.io使用TCP作为基础传输,这是一种“可靠”传输。TCP将自行重试。除非连接永久关闭,否则数据包将被传送。如果连接断开,您真正需要的是客户端重新连接(如果连接实际断开,它最终会这样做) 您可以使用socket.io的ACK功能并实现自己的超时重试,但我认为这不会给您带来太多好处,因为如果连接正常,那么TCP会在连接允许时尽快为您提供。如果TCP不能为您提供它,那么您确实需要客户端建立一个新连接(它最终会这样做),然后当新连接到来时,您需要重新传输 如果您想尝试自己的重试,可以这样做:Sockets 它';是否可以使用ack实现socket.io,如果服务器未收到ack,服务器是否会再次尝试发出该事件?,sockets,server,socket.io,backend,Sockets,Server,Socket.io,Backend,可以使用ack实现socket.io,如果服务器没有收到ack,服务器将再次尝试发出事件?socket.io使用TCP作为基础传输,这是一种“可靠”传输。TCP将自行重试。除非连接永久关闭,否则数据包将被传送。如果连接断开,您真正需要的是客户端重新连接(如果连接实际断开,它最终会这样做) 您可以使用socket.io的ACK功能并实现自己的超时重试,但我认为这不会给您带来太多好处,因为如果连接正常,那么TCP会在连接允许时尽快为您提供。如果TCP不能为您提供它,那么您确实需要客户端建立一个新连接
function delay(t) {
return new Promise(function(resolve) {
setTimeout(resolve, t);
});
}
function send(socket, msg, data, maxRetries, retryTime) {
maxRetries = maxRetries || 5;
retryTime = retryTime || 30 * 1000;
return write(socket, msg, data).catch(function() {
--maxRetries;
if (maxRetries >= 0) {
return delay(retryTime).write(socket, msg, data);
} else {
throw new Error("socket.io write failed after maxRetries")
}
});
function write(socket, msg, data) {
return new Promise(function(resolve, reject) {
let timer = setTimeout(reject, retryTime);
socket.emit(msg, data, function() {
clearTimeout(timer);
resolve();
});
});
}
}
而且,客户端上您正在发送的消息的侦听器必须适当地回复ACK
// client side
io.on('someMsg', function(data, fn) {
// process data here
console.log(data);
// call ACK function to send ack back
fn();
});
@juan55860-我添加了一些重试代码,尽管我认为它实际上没有给您带来任何好处,因为TCP已经内置了重试功能。@juan55860-这能回答您的问题吗?如果是,请通过单击答案左侧的复选标记向社区指出。这也将为您在这里遵循正确的程序赢得一些声誉积分。