using System.Diagnostics; using System.Net; using System.Text; using System.Text.Json; using Domain; using Domain.Dto; using MessagePack; using NetworkTest; using Server; using Server.DataGenerator; if (args.Length < 3) { System.Console.WriteLine("Pass three args: test/http/tcp, json/bin, and random/predictable"); return -1; } var protocol = args[0]; var serialization = args[1]; var generatorType = args[2]; int delay = 0; if (generatorType == "predictable" && args.Length > 3) { if (!int.TryParse(args[3], out delay)) { System.Console.WriteLine("Invalid delay value. Must be an integer."); return -1; } } IDataGenerator dataGenerator = generatorType switch { "random" => new RandomDataGenerator(generationInterval: TimeSpan.FromMilliseconds(1)), "predictable" => new PredictableDataGenerator(delay), _ => throw new ArgumentException("Generator type must be 'random' or 'predictable'") }; if (protocol == "test") { int nullCount = 0; long index = 0; var sw = Stopwatch.StartNew(); var lastMs = 0L; var lastIndex = 0L; var ms = 1000; var json = serialization == "json"; while (true) { var data = dataGenerator.GetPackage(); if (data == null) { nullCount++; continue; } if (json) { JsonData jsonData = new JsonData(data); var responseText = JsonSerializer.Serialize(jsonData); byte[] buffer = Encoding.UTF8.GetBytes(responseText); } else { MessagePackData msgPackData = new MessagePackData(data); byte[] buffer = MessagePackSerializer.Serialize(msgPackData); } index++; var diff = sw.ElapsedMilliseconds - lastMs; if (diff >= ms) { var serializrd = index - lastIndex; System.Console.WriteLine($"Serialized {serializrd} data packages in {diff} ms."); lastIndex = index; lastMs = sw.ElapsedMilliseconds; } } } IServer? server = protocol switch { "http" => new HttpServer(() => dataGenerator.GetPackage(), serialization == "json" ? PrepareResponseJson : PrepareResponseMessagePack), "tcp" => new TcpServer(() => dataGenerator.GetPackage(), serialization == "json" ? PrepareBytesJson : PrepareBytesMessagePack), _ => null }; server?.Start(); System.Console.WriteLine("Server started:"); System.Console.WriteLine(server); // Создаем CancellationTokenSource для управления остановкой var cts = new CancellationTokenSource(); // Обработка выхода по Ctrl+C Console.CancelKeyPress += (sender, e) => { e.Cancel = true; // Prevent immediate termination Console.WriteLine("Shutdown signal received. Stopping server..."); cts.Cancel(); server?.Stop(); Console.WriteLine("Goodbye!"); }; // Бесконечный цикл ожидания с возможностью прерывания while (!cts.Token.IsCancellationRequested) { cts.Token.WaitHandle.WaitOne(1000); } return 0; void PrepareResponseJson(Data data, HttpListenerResponse response) { JsonData jsonData = new JsonData(data); var responseText = JsonSerializer.Serialize(jsonData); byte[] buffer = Encoding.UTF8.GetBytes(responseText); response.ContentType = "application/json"; response.ContentLength64 = buffer.Length; response.OutputStream.Write(buffer, 0, buffer.Length); } void PrepareResponseMessagePack(Data data, HttpListenerResponse response) { MessagePackData msgPackData = new MessagePackData(data); byte[] buffer = MessagePackSerializer.Serialize(msgPackData); response.ContentType = "application/x-msgpack"; response.ContentLength64 = buffer.Length; response.OutputStream.Write(buffer, 0, buffer.Length); } static byte[] PrepareBytesJson(Data data) { JsonData jsonData = new JsonData(data); var responseText = JsonSerializer.Serialize(jsonData); return Encoding.UTF8.GetBytes(responseText); } static byte[] PrepareBytesMessagePack(Data data) { MessagePackData msgPackData = new MessagePackData(data); return MessagePackSerializer.Serialize(msgPackData); }