From 632b618722f79a4258eff242b4a25dbc0ccc526c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D1=8B=D1=82=D0=BA=D0=BE=D0=B2=20=D0=A0=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D0=BD?= Date: Sat, 20 Sep 2025 00:25:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20TCP=20?= =?UTF-8?q?=D0=BA=D0=BB=D0=B8=D0=B5=D0=BD=D1=82=20=D0=B2=D1=81=D1=91=20?= =?UTF-8?q?=D0=B2=D1=80=D0=B5=D0=BC=D1=8F=20=D0=BF=D1=8B=D1=82=D0=B0=D0=B5?= =?UTF-8?q?=D1=82=D1=81=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D0=BA=D0=BB=D1=8E=D1=87=D0=B8=D1=82=D1=8C=D1=81=D1=8F=20=D0=BA?= =?UTF-8?q?=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Client/TcpClient.cs | 188 ++++++++++++++++++++++---------------------- 1 file changed, 94 insertions(+), 94 deletions(-) diff --git a/Client/TcpClient.cs b/Client/TcpClient.cs index ec40c3f..4c780d8 100644 --- a/Client/TcpClient.cs +++ b/Client/TcpClient.cs @@ -45,114 +45,114 @@ public class TcpClientWrapper : IClient private async Task RunAsync(CancellationToken token) { - const int maxRetries = 5; const int retryDelayMs = 1000; - for (int attempt = 1; attempt <= maxRetries; attempt++) + while (!token.IsCancellationRequested) { try { _tcpClient = new TcpClient(); await _tcpClient.ConnectAsync(_host, _port, token); - break; // Connection successful + Console.WriteLine("Connected to server."); + + using (var stream = _tcpClient.GetStream()) + { + long index = 0; + var sw = Stopwatch.StartNew(); + var lastMs = 0L; + var lastIndex = 0L; + var ms = 1000; + while (!token.IsCancellationRequested && _tcpClient.Connected) + { + try + { + // Читаем magic header полностью + var magicBytes = new byte[4]; + int totalRead = 0; + while (totalRead < 4) + { + var read = await stream.ReadAsync(magicBytes, totalRead, 4 - totalRead, token); + if (read == 0) break; // соединение закрыто + totalRead += read; + } + if (totalRead < 4) break; + var magic = BitConverter.ToUInt32(magicBytes, 0); + if (magic != MagicHeader) + { + Console.WriteLine($"Invalid magic header: {magic:X8}, expected {MagicHeader:X8}. Skipping packet."); + continue; // or break, depending on policy + } + + // Читаем длину полностью + var lengthBytes = new byte[4]; + totalRead = 0; + while (totalRead < 4) + { + var read = await stream.ReadAsync(lengthBytes, totalRead, 4 - totalRead, token); + if (read == 0) break; // соединение закрыто + totalRead += read; + } + if (totalRead < 4) break; + var length = BitConverter.ToInt32(lengthBytes, 0); + + // Читаем данные полностью + var dataBytes = new byte[length]; + totalRead = 0; + while (totalRead < length) + { + var read = await stream.ReadAsync(dataBytes, totalRead, length - totalRead, token); + if (read == 0) break; + totalRead += read; + } + if (totalRead < length) break; + + if (_responseConverter != null) + { + var data = await _responseConverter(dataBytes); + if (data != null) + { + var diff = sw.ElapsedMilliseconds - lastMs; + if (diff >= ms) + { + var fetched = index - lastIndex; + System.Console.WriteLine($"Fetched {fetched} data packages in {diff} ms."); + lastIndex = index; + lastMs = sw.ElapsedMilliseconds; + } + //Console.WriteLine(data); + _callback?.Invoke(data); + } + } + else + { + Console.WriteLine("Response converter not set."); + } + index++; + } + catch (TaskCanceledException) + { + break; + } + catch (Exception ex) + { + Console.WriteLine($"Error: {ex.Message}"); + break; // выход из внутреннего цикла для переподключения + } + } + } + Console.WriteLine("Disconnected from server. Attempting to reconnect..."); } - catch (Exception ex) when (attempt < maxRetries) + catch (TaskCanceledException) { - Console.WriteLine($"Connection attempt {attempt} failed: {ex.Message}. Retrying in {retryDelayMs}ms..."); - await Task.Delay(retryDelayMs, token); + break; } catch (Exception ex) { - Console.WriteLine($"Failed to connect after {maxRetries} attempts: {ex.Message}"); - throw; + Console.WriteLine($"Connection failed: {ex.Message}. Retrying in {retryDelayMs}ms..."); + await Task.Delay(retryDelayMs, token); } } - - using (var stream = _tcpClient!.GetStream()) - { - long index = 0; - var sw = Stopwatch.StartNew(); - var lastMs = 0L; - var lastIndex = 0L; - var ms = 1000; - while (!token.IsCancellationRequested && _tcpClient.Connected) - { - try - { - // Читаем magic header полностью - var magicBytes = new byte[4]; - int totalRead = 0; - while (totalRead < 4) - { - var read = await stream.ReadAsync(magicBytes, totalRead, 4 - totalRead, token); - if (read == 0) break; // соединение закрыто - totalRead += read; - } - if (totalRead < 4) break; - var magic = BitConverter.ToUInt32(magicBytes, 0); - if (magic != MagicHeader) - { - Console.WriteLine($"Invalid magic header: {magic:X8}, expected {MagicHeader:X8}. Skipping packet."); - continue; // or break, depending on policy - } - - // Читаем длину полностью - var lengthBytes = new byte[4]; - totalRead = 0; - while (totalRead < 4) - { - var read = await stream.ReadAsync(lengthBytes, totalRead, 4 - totalRead, token); - if (read == 0) break; // соединение закрыто - totalRead += read; - } - if (totalRead < 4) break; - var length = BitConverter.ToInt32(lengthBytes, 0); - - // Читаем данные полностью - var dataBytes = new byte[length]; - totalRead = 0; - while (totalRead < length) - { - var read = await stream.ReadAsync(dataBytes, totalRead, length - totalRead, token); - if (read == 0) break; - totalRead += read; - } - if (totalRead < length) break; - - if (_responseConverter != null) - { - var data = await _responseConverter(dataBytes); - if (data != null) - { - var diff = sw.ElapsedMilliseconds - lastMs; - if (diff >= ms) - { - var fetched = index - lastIndex; - System.Console.WriteLine($"Fetched {fetched} data packages in {diff} ms."); - lastIndex = index; - lastMs = sw.ElapsedMilliseconds; - } - //Console.WriteLine(data); - _callback?.Invoke(data); - } - } - else - { - Console.WriteLine("Response converter not set."); - } - index++; - } - catch (TaskCanceledException) - { - break; - } - catch (Exception ex) - { - Console.WriteLine($"Error: {ex.Message}"); - } - } - } - System.Console.WriteLine("End "); + System.Console.WriteLine("Client stopped."); } public override string ToString()