最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

c# - SocketIO ignoring reconnectDelay - Stack Overflow

programmeradmin3浏览0评论

I’ve got my first websocket system set up and its working well but it is ignoring the reconnect delay and just doing it at 5000ms.

private static SocketIOClient.SocketIO _socket;
public static bool IsConnected => _isConnected;
private static bool _isConnected = false;
private static string _serverUrl = URLSettings.getServerName(APITargets.WS);
private static string _authToken = URLSettings.tennantAPIKey;
private static string _computerName = Environment.MachineName;
private static int _reconnectAttempts = 0;
private static readonly Random _random = new Random();

//Handle Websocket connection changes
public static event EventHandler<bool> ConnectionStatusChanged;

// Event Handlers
public static event EventHandler<dynamic> EventReceived_QudaDashboardUpdate;
public static event EventHandler<dynamic> EventReceived_QudaSettingsModelUpdate;
public static event EventHandler<dynamic> EventReceived_StaticSMSSettingsUpdate;
public static event EventHandler<dynamic> EventReceived_APIRequestReconnect;
public static event EventHandler<dynamic> EventReceived_HaloPayWarningUpdate;
public static event EventHandler<dynamic> EventReceived_SMSResponseUpdate;
public static event EventHandler<dynamic> EventReceived_SlackChatUpdate_Quda;
public static event EventHandler<dynamic> EventReceived_SlackChatUpdate_Cherub;
public static event EventHandler<dynamic> EventReceived_SlackChatUpdate_HaloPay;
public static event EventHandler<dynamic> EventReceived_SlackChatUpdate_DocLink;
public static event EventHandler<dynamic> EventReceived_SlackChatUpdate_Webbit;
public static event EventHandler<dynamic> EventReceived_SlackChatUpdate_HaloText;
public static event EventHandler<dynamic> EventReceived_SlackChatUpdate_ZephyrClaims;
public static event EventHandler<dynamic> EventReceived_SubscriptionEvent;
public static event EventHandler<dynamic> EventReceived_DocLinkStatusUpdate;
static int randomDelay = _random.Next(5000, 20000);


public static async Task StartSocketIOListenerAsync()
{
    if (_isConnected)
    {
        StreamLogger.Info("Socket.IO Listener is already running.");
        return;
    }

    StreamLogger.Info("Initializing Socket.IO Connection...");
    Console.WriteLine(randomDelay);
    var options = new SocketIOOptions
    {
        Reconnection = true,
        ReconnectionDelay = 10000,
        ReconnectionAttempts = int.MaxValue,
        RandomizationFactor = 0.5,
        Transport = SocketIOClient.Transport.TransportProtocol.WebSocket,
        ExtraHeaders = new Dictionary<string, string>
        {
            { "X-Token", _authToken },
            { "X-Computer-Name", _computerName }
        }
    };

    _socket = new SocketIOClient.SocketIO(_serverUrl, options);

    _socket.OnConnected += (sender, e) =>
    {
        _isConnected = true;
        _reconnectAttempts = 0; // Reset attempt counter on successful connection
        ConnectionStatusChanged?.Invoke(null, true);
        StreamLogger.Info("Socket.IO Connected.");
    };

    _socket.OnDisconnected += async (sender, e) =>
    {
        _isConnected = false;
        ConnectionStatusChanged?.Invoke(null, false);
        StreamLogger.Warning($"Socket.IO Disconnected: {e}");
        //await ReconnectIfNeeded();
    };

    _socket.OnError += async (sender, e) =>
    {
        _isConnected = false;
        ConnectionStatusChanged?.Invoke(null, false);
        StreamLogger.Error($"Socket.IO Connection Error: {e}");
        //await ReconnectIfNeeded();
    };

    SubscribeToEvents();
    await _socket.ConnectAsync();
}

I’ve tried adding random delays between 5000-30000 but it always stays at 5.

I have about 2000 clients staying connected at a time, so if the server goes down and all 2000 try and reconnect I'm concerned there will be issues.

I’ve got my first websocket system set up and its working well but it is ignoring the reconnect delay and just doing it at 5000ms.

private static SocketIOClient.SocketIO _socket;
public static bool IsConnected => _isConnected;
private static bool _isConnected = false;
private static string _serverUrl = URLSettings.getServerName(APITargets.WS);
private static string _authToken = URLSettings.tennantAPIKey;
private static string _computerName = Environment.MachineName;
private static int _reconnectAttempts = 0;
private static readonly Random _random = new Random();

//Handle Websocket connection changes
public static event EventHandler<bool> ConnectionStatusChanged;

// Event Handlers
public static event EventHandler<dynamic> EventReceived_QudaDashboardUpdate;
public static event EventHandler<dynamic> EventReceived_QudaSettingsModelUpdate;
public static event EventHandler<dynamic> EventReceived_StaticSMSSettingsUpdate;
public static event EventHandler<dynamic> EventReceived_APIRequestReconnect;
public static event EventHandler<dynamic> EventReceived_HaloPayWarningUpdate;
public static event EventHandler<dynamic> EventReceived_SMSResponseUpdate;
public static event EventHandler<dynamic> EventReceived_SlackChatUpdate_Quda;
public static event EventHandler<dynamic> EventReceived_SlackChatUpdate_Cherub;
public static event EventHandler<dynamic> EventReceived_SlackChatUpdate_HaloPay;
public static event EventHandler<dynamic> EventReceived_SlackChatUpdate_DocLink;
public static event EventHandler<dynamic> EventReceived_SlackChatUpdate_Webbit;
public static event EventHandler<dynamic> EventReceived_SlackChatUpdate_HaloText;
public static event EventHandler<dynamic> EventReceived_SlackChatUpdate_ZephyrClaims;
public static event EventHandler<dynamic> EventReceived_SubscriptionEvent;
public static event EventHandler<dynamic> EventReceived_DocLinkStatusUpdate;
static int randomDelay = _random.Next(5000, 20000);


public static async Task StartSocketIOListenerAsync()
{
    if (_isConnected)
    {
        StreamLogger.Info("Socket.IO Listener is already running.");
        return;
    }

    StreamLogger.Info("Initializing Socket.IO Connection...");
    Console.WriteLine(randomDelay);
    var options = new SocketIOOptions
    {
        Reconnection = true,
        ReconnectionDelay = 10000,
        ReconnectionAttempts = int.MaxValue,
        RandomizationFactor = 0.5,
        Transport = SocketIOClient.Transport.TransportProtocol.WebSocket,
        ExtraHeaders = new Dictionary<string, string>
        {
            { "X-Token", _authToken },
            { "X-Computer-Name", _computerName }
        }
    };

    _socket = new SocketIOClient.SocketIO(_serverUrl, options);

    _socket.OnConnected += (sender, e) =>
    {
        _isConnected = true;
        _reconnectAttempts = 0; // Reset attempt counter on successful connection
        ConnectionStatusChanged?.Invoke(null, true);
        StreamLogger.Info("Socket.IO Connected.");
    };

    _socket.OnDisconnected += async (sender, e) =>
    {
        _isConnected = false;
        ConnectionStatusChanged?.Invoke(null, false);
        StreamLogger.Warning($"Socket.IO Disconnected: {e}");
        //await ReconnectIfNeeded();
    };

    _socket.OnError += async (sender, e) =>
    {
        _isConnected = false;
        ConnectionStatusChanged?.Invoke(null, false);
        StreamLogger.Error($"Socket.IO Connection Error: {e}");
        //await ReconnectIfNeeded();
    };

    SubscribeToEvents();
    await _socket.ConnectAsync();
}

I’ve tried adding random delays between 5000-30000 but it always stays at 5.

I have about 2000 clients staying connected at a time, so if the server goes down and all 2000 try and reconnect I'm concerned there will be issues.

Share Improve this question asked Mar 14 at 9:17 Glenn AngelGlenn Angel 11 bronze badge 3
  • You are not using randomDelay in the code. All you are doing is outputting the value. The delay is always set to ReconnectionDelay = 10000, A socket retries to connect up to 3 times at 5 seconds intervals and that may be why you are seeing a retry every 5 seconds. – jdweng Commented Mar 14 at 13:02
  • Thanks @jdweng that was intentional in case it was having issues with the variable. It wasnt even waiting the 10 sec just 5 though. – Glenn Angel Commented Mar 15 at 11:04
  • Websocket is using TCP for the transport method and there is a delay in TCP. See stackoverflow/questions/63675902/… – jdweng Commented Mar 15 at 11:14
Add a comment  | 

1 Answer 1

Reset to default 0

I found the answer which i wasnt aware of. There is a MaxReconnectionDelay which is default at 5 sec.

What was happening is that since my delay was random + 5sec, it would just default ot 5 sec.

I have changed the max delay to 45 seconds now (yes very long) and my random reconnect delay is set to between 5 and 45 secs. This is now working!!

发布评论

评论列表(0)

  1. 暂无评论