Files
NetworkTest/Server/Program.cs

150 lines
4.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}