Sockets 它';是否可以使用ack实现socket.io,如果服务器未收到ack,服务器是否会再次尝试发出该事件?

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不能为您提供它,那么您确实需要客户端建立一个新连接

可以使用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-这能回答您的问题吗?如果是,请通过单击答案左侧的复选标记向社区指出。这也将为您在这里遵循正确的程序赢得一些声誉积分。