425 lines
14 KiB
C#
425 lines
14 KiB
C#
using System.Text;
|
|
|
|
namespace EonaCat.JASP
|
|
{
|
|
class Program
|
|
{
|
|
static async Task Main(string[] args)
|
|
{
|
|
Console.WriteLine("EonaCat.JASP.Tester");
|
|
Console.WriteLine("==========================================\n");
|
|
|
|
Console.WriteLine("Select example to run:");
|
|
Console.WriteLine("1. TCP Server/Client (No encryption)");
|
|
Console.WriteLine("2. TCP Server/Client with AES Encryption");
|
|
Console.WriteLine("3. TCP Server/Client with Authentication");
|
|
Console.WriteLine("4. UDP Server/Client");
|
|
Console.WriteLine("5. Client-to-Client Messaging");
|
|
Console.WriteLine("6. Performance Test (10,000 messages)");
|
|
Console.Write("\nEnter choice (1-6): ");
|
|
|
|
var choice = Console.ReadLine();
|
|
|
|
switch (choice)
|
|
{
|
|
case "1":
|
|
await RunBasicTcpExample();
|
|
break;
|
|
case "2":
|
|
await RunTcpWithEncryptionExample();
|
|
break;
|
|
case "3":
|
|
await RunTcpWithAuthExample();
|
|
break;
|
|
case "4":
|
|
await RunUdpExample();
|
|
break;
|
|
case "5":
|
|
await RunClientToClientExample();
|
|
break;
|
|
case "6":
|
|
await RunPerformanceTest();
|
|
break;
|
|
default:
|
|
Console.WriteLine("Invalid choice");
|
|
break;
|
|
}
|
|
|
|
Console.WriteLine("\nPress any key to exit...");
|
|
Console.ReadKey();
|
|
}
|
|
|
|
static async Task RunBasicTcpExample()
|
|
{
|
|
Console.WriteLine("\n=== Basic TCP Example ===\n");
|
|
|
|
// Create server
|
|
var server = new NetworkServer(ProtocolType.TCP, 5000);
|
|
|
|
server.DataReceived += (s, e) =>
|
|
{
|
|
var message = Encoding.UTF8.GetString(e.Data);
|
|
Console.WriteLine($"[SERVER] Received from {e.FromUsername}: {message}");
|
|
|
|
// Echo back
|
|
server.SendToClient(e.FromUsername, $"Echo: {message}");
|
|
};
|
|
|
|
server.ClientConnected += (s, e) =>
|
|
{
|
|
Console.WriteLine($"[SERVER] Client connected: {e.Username}");
|
|
};
|
|
|
|
server.ClientDisconnected += (s, e) =>
|
|
{
|
|
Console.WriteLine($"[SERVER] Client disconnected: {e.Username}");
|
|
};
|
|
|
|
server.ErrorOccurred += (s, e) =>
|
|
{
|
|
Console.WriteLine($"[SERVER ERROR] {e.Message}: {e.Exception?.Message}");
|
|
};
|
|
|
|
server.Start();
|
|
Console.WriteLine("[SERVER] Started on port 5000");
|
|
|
|
// Wait for server to start
|
|
await Task.Delay(500);
|
|
|
|
// Create client
|
|
var client = new NetworkClient(ProtocolType.TCP, "127.0.0.1", 5000);
|
|
|
|
client.DataReceived += (s, e) =>
|
|
{
|
|
var message = Encoding.UTF8.GetString(e.Data);
|
|
Console.WriteLine($"[CLIENT] Received: {message}");
|
|
};
|
|
|
|
client.Connected += (s, e) =>
|
|
{
|
|
Console.WriteLine("[CLIENT] Connected to server");
|
|
};
|
|
|
|
client.ErrorOccurred += (s, e) =>
|
|
{
|
|
Console.WriteLine($"[CLIENT ERROR] {e.Message}: {e.Exception?.Message}");
|
|
};
|
|
|
|
await client.ConnectAsync();
|
|
|
|
// Send messages
|
|
for (int i = 1; i <= 5; i++)
|
|
{
|
|
client.SendString($"Message {i}");
|
|
await Task.Delay(100);
|
|
}
|
|
|
|
await Task.Delay(1000);
|
|
|
|
// Show stats
|
|
Console.WriteLine("\n--- Server Stats ---");
|
|
Console.WriteLine(server.GetStats());
|
|
|
|
Console.WriteLine("\n--- Client Stats ---");
|
|
Console.WriteLine(client.GetStats());
|
|
|
|
// Cleanup
|
|
client.Disconnect();
|
|
server.Stop();
|
|
}
|
|
|
|
static async Task RunTcpWithEncryptionExample()
|
|
{
|
|
Console.WriteLine("\n=== TCP with AES Encryption Example ===\n");
|
|
|
|
var server = new NetworkServer(ProtocolType.TCP, 5001, useAES: true);
|
|
|
|
server.DataReceived += (s, e) =>
|
|
{
|
|
var message = Encoding.UTF8.GetString(e.Data);
|
|
Console.WriteLine($"[SERVER] Received encrypted message: {message}");
|
|
};
|
|
|
|
server.ClientConnected += (s, e) =>
|
|
{
|
|
Console.WriteLine($"[SERVER] Client connected with encryption: {e.Username}");
|
|
};
|
|
|
|
server.Start();
|
|
Console.WriteLine("[SERVER] Started with AES encryption on port 5001");
|
|
|
|
await Task.Delay(500);
|
|
|
|
var client = new NetworkClient(ProtocolType.TCP, "127.0.0.1", 5001, useAES: true);
|
|
|
|
client.DataReceived += (s, e) =>
|
|
{
|
|
var message = Encoding.UTF8.GetString(e.Data);
|
|
Console.WriteLine($"[CLIENT] Received encrypted message: {message}");
|
|
};
|
|
|
|
await client.ConnectAsync();
|
|
|
|
client.SendString("This message is encrypted!");
|
|
client.SendString("All communication is secure.");
|
|
|
|
await Task.Delay(1000);
|
|
|
|
Console.WriteLine("\n--- Server Stats ---");
|
|
Console.WriteLine(server.GetStats());
|
|
|
|
client.Disconnect();
|
|
server.Stop();
|
|
}
|
|
|
|
static async Task RunTcpWithAuthExample()
|
|
{
|
|
Console.WriteLine("\n=== TCP with Authentication Example ===\n");
|
|
|
|
var server = new NetworkServer(
|
|
ProtocolType.TCP,
|
|
5002,
|
|
username: "ServerAdmin",
|
|
password: "SecurePassword123");
|
|
|
|
server.DataReceived += (s, e) =>
|
|
{
|
|
var message = Encoding.UTF8.GetString(e.Data);
|
|
Console.WriteLine($"[SERVER] Received from authenticated user {e.FromUsername}: {message}");
|
|
};
|
|
|
|
server.ClientConnected += (s, e) =>
|
|
{
|
|
Console.WriteLine($"[SERVER] Authenticated client: {e.Username}");
|
|
};
|
|
|
|
server.Start();
|
|
Console.WriteLine("[SERVER] Started with authentication on port 5002");
|
|
|
|
await Task.Delay(500);
|
|
|
|
// Client with correct credentials
|
|
var client1 = new NetworkClient(
|
|
ProtocolType.TCP,
|
|
"127.0.0.1",
|
|
5002,
|
|
username: "Alice",
|
|
password: "SecurePassword123");
|
|
|
|
await client1.ConnectAsync();
|
|
client1.SendString("Hello from authenticated client!");
|
|
|
|
await Task.Delay(500);
|
|
|
|
// Try client with wrong credentials (will fail to connect)
|
|
try
|
|
{
|
|
var client2 = new NetworkClient(
|
|
ProtocolType.TCP,
|
|
"127.0.0.1",
|
|
5002,
|
|
username: "Hacker",
|
|
password: "WrongPassword");
|
|
|
|
await client2.ConnectAsync();
|
|
Console.WriteLine("[CLIENT2] Should not see this - auth should fail");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"[CLIENT2] Authentication failed (expected): {ex.Message}");
|
|
}
|
|
|
|
await Task.Delay(1000);
|
|
|
|
client1.Disconnect();
|
|
server.Stop();
|
|
}
|
|
|
|
static async Task RunUdpExample()
|
|
{
|
|
Console.WriteLine("\n=== UDP Example ===\n");
|
|
|
|
var server = new NetworkServer(ProtocolType.UDP, 5003);
|
|
|
|
server.DataReceived += (s, e) =>
|
|
{
|
|
var message = Encoding.UTF8.GetString(e.Data);
|
|
Console.WriteLine($"[SERVER] UDP received: {message}");
|
|
};
|
|
|
|
server.Start();
|
|
Console.WriteLine("[SERVER] Started UDP on port 5003");
|
|
|
|
await Task.Delay(500);
|
|
|
|
var client = new NetworkClient(ProtocolType.UDP, "127.0.0.1", 5003, username: "UDPClient");
|
|
|
|
await client.ConnectAsync();
|
|
|
|
for (int i = 1; i <= 5; i++)
|
|
{
|
|
client.SendString($"UDP Message {i}");
|
|
await Task.Delay(50);
|
|
}
|
|
|
|
await Task.Delay(1000);
|
|
|
|
Console.WriteLine("\n--- Server Stats ---");
|
|
Console.WriteLine(server.GetStats());
|
|
|
|
client.Disconnect();
|
|
server.Stop();
|
|
}
|
|
|
|
static async Task RunClientToClientExample()
|
|
{
|
|
Console.WriteLine("\n=== Client-to-Client Messaging Example ===\n");
|
|
|
|
var server = new NetworkServer(ProtocolType.TCP, 5004);
|
|
|
|
server.DataReceived += (s, e) =>
|
|
{
|
|
Console.WriteLine($"[SERVER] Routing message from {e.FromUsername} to {e.Message.ToUsername}");
|
|
};
|
|
|
|
server.ClientConnected += (s, e) =>
|
|
{
|
|
Console.WriteLine($"[SERVER] Client connected: {e.Username}");
|
|
server.BroadcastString($"User {e.Username} joined", e.Username);
|
|
};
|
|
|
|
server.Start();
|
|
Console.WriteLine("[SERVER] Started on port 5004");
|
|
|
|
await Task.Delay(500);
|
|
|
|
// Create multiple clients
|
|
var alice = new NetworkClient(ProtocolType.TCP, "127.0.0.1", 5004, username: "Alice");
|
|
var bob = new NetworkClient(ProtocolType.TCP, "127.0.0.1", 5004, username: "Bob");
|
|
var charlie = new NetworkClient(ProtocolType.TCP, "127.0.0.1", 5004, username: "Charlie");
|
|
|
|
alice.DataReceived += (s, e) =>
|
|
{
|
|
var message = Encoding.UTF8.GetString(e.Data);
|
|
Console.WriteLine($"[ALICE] Received: {message}");
|
|
};
|
|
|
|
bob.DataReceived += (s, e) =>
|
|
{
|
|
var message = Encoding.UTF8.GetString(e.Data);
|
|
Console.WriteLine($"[BOB] Received: {message}");
|
|
};
|
|
|
|
charlie.DataReceived += (s, e) =>
|
|
{
|
|
var message = Encoding.UTF8.GetString(e.Data);
|
|
Console.WriteLine($"[CHARLIE] Received: {message}");
|
|
};
|
|
|
|
await alice.ConnectAsync();
|
|
await Task.Delay(100);
|
|
await bob.ConnectAsync();
|
|
await Task.Delay(100);
|
|
await charlie.ConnectAsync();
|
|
await Task.Delay(500);
|
|
|
|
// Alice sends direct message to Bob
|
|
Console.WriteLine("\n[ALICE] Sending direct message to Bob...");
|
|
alice.SendToClient("Bob", "Hi Bob, this is Alice!");
|
|
|
|
await Task.Delay(200);
|
|
|
|
// Bob sends direct message to Charlie
|
|
Console.WriteLine("\n[BOB] Sending direct message to Charlie...");
|
|
bob.SendToClient("Charlie", "Hey Charlie, it's Bob!");
|
|
|
|
await Task.Delay(200);
|
|
|
|
// Server broadcasts to all
|
|
Console.WriteLine("\n[SERVER] Broadcasting to all clients...");
|
|
server.BroadcastString("Server announcement: System maintenance in 5 minutes");
|
|
|
|
await Task.Delay(1000);
|
|
|
|
Console.WriteLine("\n--- Connected Clients ---");
|
|
foreach (var client in server.GetConnectedClients())
|
|
{
|
|
Console.WriteLine($" - {client.Username} (ID: {client.ClientId})");
|
|
}
|
|
|
|
alice.Disconnect();
|
|
bob.Disconnect();
|
|
charlie.Disconnect();
|
|
server.Stop();
|
|
}
|
|
|
|
static async Task RunPerformanceTest()
|
|
{
|
|
Console.WriteLine("\n=== Performance Test (10,000 messages) ===\n");
|
|
|
|
var server = new NetworkServer(ProtocolType.TCP, 5005);
|
|
int messagesReceived = 0;
|
|
|
|
server.DataReceived += (s, e) =>
|
|
{
|
|
Interlocked.Increment(ref messagesReceived);
|
|
};
|
|
|
|
server.Start();
|
|
Console.WriteLine("[SERVER] Started on port 5005");
|
|
|
|
await Task.Delay(500);
|
|
|
|
var client = new NetworkClient(ProtocolType.TCP, "127.0.0.1", 5005);
|
|
await client.ConnectAsync();
|
|
|
|
Console.WriteLine("[CLIENT] Connected. Starting performance test...\n");
|
|
|
|
var startTime = DateTime.UtcNow;
|
|
|
|
// Send 10,000 messages as fast as possible
|
|
var tasks = new Task[10];
|
|
int messagesPerTask = 1000;
|
|
|
|
for (int t = 0; t < 10; t++)
|
|
{
|
|
int taskId = t;
|
|
tasks[t] = Task.Run(() =>
|
|
{
|
|
for (int i = 0; i < messagesPerTask; i++)
|
|
{
|
|
client.SendString($"Performance test message {taskId}-{i}");
|
|
}
|
|
});
|
|
}
|
|
|
|
await Task.WhenAll(tasks);
|
|
|
|
// Wait for all messages to be received
|
|
while (messagesReceived < 10000)
|
|
{
|
|
await Task.Delay(10);
|
|
}
|
|
|
|
var endTime = DateTime.UtcNow;
|
|
var duration = (endTime - startTime).TotalMilliseconds;
|
|
|
|
Console.WriteLine($"Performance Test Results:");
|
|
Console.WriteLine($" Total Messages: 10,000");
|
|
Console.WriteLine($" Duration: {duration:N2} ms");
|
|
Console.WriteLine($" Messages/second: {(10000 / (duration / 1000)):N2}");
|
|
Console.WriteLine($" Average latency: {(duration / 10000):N4} ms per message");
|
|
|
|
await Task.Delay(500);
|
|
|
|
Console.WriteLine("\n--- Server Stats ---");
|
|
Console.WriteLine(server.GetStats());
|
|
|
|
Console.WriteLine("\n--- Client Stats ---");
|
|
Console.WriteLine(client.GetStats());
|
|
|
|
client.Disconnect();
|
|
server.Stop();
|
|
}
|
|
}
|
|
} |