gpt4 book ai didi

sockets - 可以用ack实现socket.io,如果服务端没有收到ack,服务端再尝试发出事件?

转载 作者:行者123 更新时间:2023-12-03 11:52:52 26 4
gpt4 key购买 nike

可以使用 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();
});

关于sockets - 可以用ack实现socket.io,如果服务端没有收到ack,服务端再尝试发出事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50996161/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com