150 lines
4.3 KiB
C#
150 lines
4.3 KiB
C#
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);
|
||
}
|
||
|