diff --git a/Tests/MQTTnet.TestApp.NetFramework/MQTTnet.TestApp.NetFramework.csproj b/Tests/MQTTnet.TestApp.NetFramework/MQTTnet.TestApp.NetFramework.csproj
index 2bf571e9..7d112f5a 100644
--- a/Tests/MQTTnet.TestApp.NetFramework/MQTTnet.TestApp.NetFramework.csproj
+++ b/Tests/MQTTnet.TestApp.NetFramework/MQTTnet.TestApp.NetFramework.csproj
@@ -82,6 +82,7 @@
+
diff --git a/Tests/MQTTnet.TestApp.NetFramework/PerformanceTest.cs b/Tests/MQTTnet.TestApp.NetFramework/PerformanceTest.cs
new file mode 100644
index 00000000..8a005529
--- /dev/null
+++ b/Tests/MQTTnet.TestApp.NetFramework/PerformanceTest.cs
@@ -0,0 +1,163 @@
+using MQTTnet.Core;
+using MQTTnet.Core.Client;
+using MQTTnet.Core.Packets;
+using MQTTnet.Core.Protocol;
+using MQTTnet.Core.Server;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MQTTnet.TestApp.NetFramework
+{
+ public class PerformanceTest
+ {
+ public static async Task RunAsync()
+ {
+ var server = Task.Run(() => RunServerAsync());
+ var client = Task.Run(() => RunClientAsync(50, TimeSpan.FromMilliseconds(10)));
+
+ await Task.WhenAll(server, client);
+ }
+
+ private static async Task RunClientAsync( int msgChunkSize, TimeSpan interval )
+ {
+ try
+ {
+ var options = new MqttClientOptions
+ {
+ Server = "localhost",
+ ClientId = "XYZ",
+ CleanSession = true
+ };
+
+ var client = new MqttClientFactory().CreateMqttClient(options);
+ client.ApplicationMessageReceived += (s, e) =>
+ {
+ };
+
+ client.Connected += async (s, e) =>
+ {
+ Console.WriteLine("### CONNECTED WITH SERVER ###");
+
+ await client.SubscribeAsync(new List
+ {
+ new TopicFilter("#", MqttQualityOfServiceLevel.AtMostOnce)
+ });
+
+ Console.WriteLine("### SUBSCRIBED ###");
+ };
+
+ client.Disconnected += async (s, e) =>
+ {
+ Console.WriteLine("### DISCONNECTED FROM SERVER ###");
+ await Task.Delay(TimeSpan.FromSeconds(5));
+
+ try
+ {
+ await client.ConnectAsync();
+ }
+ catch
+ {
+ Console.WriteLine("### RECONNECTING FAILED ###");
+ }
+ };
+
+ try
+ {
+ await client.ConnectAsync();
+ }
+ catch (Exception exception)
+ {
+ Console.WriteLine("### CONNECTING FAILED ###" + Environment.NewLine + exception);
+ }
+
+ Console.WriteLine("### WAITING FOR APPLICATION MESSAGES ###");
+
+ var last = DateTime.Now;
+ var msgs = 0;
+
+ while (true)
+ {
+ for (int i = 0; i < msgChunkSize; i++)
+ {
+ var applicationMessage = new MqttApplicationMessage(
+ "A/B/C",
+ Encoding.UTF8.GetBytes("Hello World"),
+ MqttQualityOfServiceLevel.AtLeastOnce,
+ false
+ );
+
+ //do not await to send as much messages as possible
+ await client.PublishAsync(applicationMessage);
+ msgs++;
+ }
+
+ var now = DateTime.Now;
+ if (last < now - TimeSpan.FromSeconds(1))
+ {
+ Console.WriteLine( $"sending {msgs} inteded {msgChunkSize / interval.TotalSeconds}" );
+ msgs = 0;
+ last = now;
+ }
+
+ await Task.Delay(interval);
+ }
+ }
+ catch (Exception exception)
+ {
+ Console.WriteLine(exception);
+ }
+ }
+
+ private static void RunServerAsync()
+ {
+ try
+ {
+ var options = new MqttServerOptions
+ {
+ ConnectionValidator = p =>
+ {
+ if (p.ClientId == "SpecialClient")
+ {
+ if (p.Username != "USER" || p.Password != "PASS")
+ {
+ return MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
+ }
+ }
+
+ return MqttConnectReturnCode.ConnectionAccepted;
+ }
+ };
+
+ var mqttServer = new MqttServerFactory().CreateMqttServer(options);
+ var last = DateTime.Now;
+ var msgs = 0;
+ mqttServer.ApplicationMessageReceived += (sender, args) =>
+ {
+ msgs++;
+ var now = DateTime.Now;
+ if (last < now - TimeSpan.FromSeconds(1))
+ {
+ Console.WriteLine($"received {msgs}");
+ msgs = 0;
+ last = now;
+ }
+ };
+ mqttServer.Start();
+
+ Console.WriteLine("Press any key to exit.");
+ Console.ReadLine();
+
+ mqttServer.Stop();
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e);
+ }
+
+ Console.ReadLine();
+ }
+ }
+}
diff --git a/Tests/MQTTnet.TestApp.NetFramework/Program.cs b/Tests/MQTTnet.TestApp.NetFramework/Program.cs
index 427274f4..d27f423a 100644
--- a/Tests/MQTTnet.TestApp.NetFramework/Program.cs
+++ b/Tests/MQTTnet.TestApp.NetFramework/Program.cs
@@ -19,6 +19,7 @@ namespace MQTTnet.TestApp.NetFramework
Console.WriteLine("MQTTnet - TestApp.NetFramework");
Console.WriteLine("1 = Start client");
Console.WriteLine("2 = Start server");
+ Console.WriteLine("3 = Start performance test");
var pressedKey = Console.ReadKey(true);
if (pressedKey.Key == ConsoleKey.D1)
{
@@ -30,6 +31,11 @@ namespace MQTTnet.TestApp.NetFramework
Task.Run(() => RunServerAsync(args));
Thread.Sleep(Timeout.Infinite);
}
+ else if (pressedKey.Key == ConsoleKey.D3)
+ {
+ Task.Run(() => PerformanceTest.RunAsync());
+ Thread.Sleep(Timeout.Infinite);
+ }
}
private static async Task RunClientAsync(string[] arguments)