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
1 Answer
Reset to default 0I 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!!