diff --git a/Dependencies.props b/Dependencies.props
deleted file mode 100644
index a8494eedd..000000000
--- a/Dependencies.props
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
- 8.0.0
- 8.0.0
- 8.0.0
-
-
\ No newline at end of file
diff --git a/Directory.Build.props b/Directory.Build.props
index d4d97183f..4f06836cb 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -1,8 +1,8 @@
-
10.0
- netstandard2.1;net5.0;net6.0;net7.0;net8.0
+ net6.0;net7.0;net8.0
+ netstandard2.1;$(DotNetTargetFrameworks)
net8.0
@@ -20,7 +20,7 @@
Kerry Jiang
-
+
diff --git a/Directory.Packages.props b/Directory.Packages.props
new file mode 100644
index 000000000..609690110
--- /dev/null
+++ b/Directory.Packages.props
@@ -0,0 +1,29 @@
+
+
+ true
+ 8.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 5f87a98be..b5839dc4d 100644
--- a/README.md
+++ b/README.md
@@ -21,22 +21,18 @@
| Package | MyGet Version | NuGet Version | Download |
| :------|:------------:|:------------:|:--------:|
| **SuperSocket**
(all in one) | [![MyGet Version](https://img.shields.io/myget/supersocket/vpre/SuperSocket)](https://www.myget.org/feed/supersocket/package/nuget/SuperSocket) | [![NuGet Version](https://img.shields.io/nuget/vpre/SuperSocket.svg?style=flat)](https://www.nuget.org/packages/SuperSocket/)| [![NuGet Download](https://img.shields.io/nuget/dt/SuperSocket.svg?style=flat)](https://www.nuget.org/packages/SuperSocket/) |
-| ~~**SuperSocket.WebSocketServer**~~
(Use SuperSocket.WebSocket.Server instead) | [![MyGet Version](https://img.shields.io/myget/supersocket/vpre/SuperSocket.WebSocketServer)](https://www.myget.org/feed/supersocket/package/nuget/SuperSocket.WebSocketServer) | [![NuGet Version](https://img.shields.io/nuget/vpre/SuperSocket.WebSocketServer.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.WebSocketServer/)| [![NuGet Download](https://img.shields.io/nuget/dt/SuperSocket.WebSocketServer.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.WebSocketServer/) |
| **SuperSocket.ProtoBase** | [![MyGet Version](https://img.shields.io/myget/supersocket/vpre/SuperSocket.ProtoBase)](https://www.myget.org/feed/supersocket/package/nuget/SuperSocket.ProtoBase) | [![NuGet Version](https://img.shields.io/nuget/vpre/SuperSocket.ProtoBase.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.ProtoBase/)| [![NuGet Download](https://img.shields.io/nuget/dt/SuperSocket.ProtoBase.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.ProtoBase/) |
| **SuperSocket.Primitives** | [![MyGet Version](https://img.shields.io/myget/supersocket/vpre/SuperSocket.Primitives)](https://www.myget.org/feed/supersocket/package/nuget/SuperSocket.Primitives) | [![NuGet Version](https://img.shields.io/nuget/vpre/SuperSocket.Primitives.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Primitives/)| [![NuGet Download](https://img.shields.io/nuget/dt/SuperSocket.Primitives.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Primitives/) |
-| ~~**SuperSocket.Channel**~~ | [![MyGet Version](https://img.shields.io/myget/supersocket/vpre/SuperSocket.Channel)](https://www.myget.org/feed/supersocket/package/nuget/SuperSocket.Channel) | [![NuGet Version](https://img.shields.io/nuget/vpre/SuperSocket.Channel.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Channel/)| [![NuGet Download](https://img.shields.io/nuget/dt/SuperSocket.Channel.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Channel/) |
| **SuperSocket.Connection** | [![MyGet Version](https://img.shields.io/myget/supersocket/vpre/SuperSocket.Connection)](https://www.myget.org/feed/supersocket/package/nuget/SuperSocket.Connection) | [![NuGet Version](https://img.shields.io/nuget/vpre/SuperSocket.Connection.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Connection/)| [![NuGet Download](https://img.shields.io/nuget/dt/SuperSocket.Connection.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Connection/) |
| **SuperSocket.Kestrel** | [![MyGet Version](https://img.shields.io/myget/supersocket/vpre/SuperSocket.Kestrel)](https://www.myget.org/feed/supersocket/package/nuget/SuperSocket.Kestrel) | [![NuGet Version](https://img.shields.io/nuget/vpre/SuperSocket.Kestrel.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Kestrel/)| [![NuGet Download](https://img.shields.io/nuget/dt/SuperSocket.Kestrel.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Kestrel/) |
| **SuperSocket.Server** | [![MyGet Version](https://img.shields.io/myget/supersocket/vpre/SuperSocket.Server)](https://www.myget.org/feed/supersocket/package/nuget/SuperSocket.Server) | [![NuGet Version](https://img.shields.io/nuget/vpre/SuperSocket.Server.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Server/)| [![NuGet Download](https://img.shields.io/nuget/dt/SuperSocket.Server.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Server/) |
| **SuperSocket.Server.Abstractions** | [![MyGet Version](https://img.shields.io/myget/supersocket/vpre/SuperSocket.Server.Abstractions)](https://www.myget.org/feed/supersocket/package/nuget/SuperSocket.Server.Abstractions) | [![NuGet Version](https://img.shields.io/nuget/vpre/SuperSocket.Server.Abstractions.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Server.Abstractions/)| [![NuGet Download](https://img.shields.io/nuget/dt/SuperSocket.Server.Abstractions.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Server.Abstractions/) |
| **SuperSocket.Command** | [![MyGet Version](https://img.shields.io/myget/supersocket/vpre/SuperSocket.Command)](https://www.myget.org/feed/supersocket/package/nuget/SuperSocket.Command) | [![NuGet Version](https://img.shields.io/nuget/vpre/SuperSocket.Command.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Command/)| [![NuGet Download](https://img.shields.io/nuget/dt/SuperSocket.Command.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Command/) |
-| ~~**SuperSocket.SessionContainer**~~ | [![MyGet Version](https://img.shields.io/myget/supersocket/vpre/SuperSocket.SessionContainer)](https://www.myget.org/feed/supersocket/package/nuget/SuperSocket.SessionContainer) | [![NuGet Version](https://img.shields.io/nuget/vpre/SuperSocket.SessionContainer.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.SessionContainer/)| [![NuGet Download](https://img.shields.io/nuget/dt/SuperSocket.SessionContainer.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.SessionContainer/) |
| **SuperSocket.Client** | [![MyGet Version](https://img.shields.io/myget/supersocket/vpre/SuperSocket.Client)](https://www.myget.org/feed/supersocket/package/nuget/SuperSocket.Client) | [![NuGet Version](https://img.shields.io/nuget/vpre/SuperSocket.Client.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Client/)| [![NuGet Download](https://img.shields.io/nuget/dt/SuperSocket.Client.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Client/) |
| **SuperSocket.Client.Proxy** | [![MyGet Version](https://img.shields.io/myget/supersocket/vpre/SuperSocket.Client.Proxy)](https://www.myget.org/feed/supersocket/package/nuget/SuperSocket.Client.Proxy) | [![NuGet Version](https://img.shields.io/nuget/vpre/SuperSocket.Client.Proxy.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Client.Proxy/)| [![NuGet Download](https://img.shields.io/nuget/dt/SuperSocket.Client.Proxy.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Client.Proxy/) |
| **SuperSocket.WebSocket** | [![MyGet Version](https://img.shields.io/myget/supersocket/vpre/SuperSocket.WebSocket)](https://www.myget.org/feed/supersocket/package/nuget/SuperSocket.WebSocket) | [![NuGet Version](https://img.shields.io/nuget/vpre/SuperSocket.WebSocket.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.WebSocket/)| [![NuGet Download](https://img.shields.io/nuget/dt/SuperSocket.WebSocket.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.WebSocket/) |
| **SuperSocket.WebSocket.Server** | [![MyGet Version](https://img.shields.io/myget/supersocket/vpre/SuperSocket.WebSocket.Server)](https://www.myget.org/feed/supersocket/package/nuget/SuperSocket.WebSocket.Server) | [![NuGet Version](https://img.shields.io/nuget/vpre/SuperSocket.WebSocket.Server.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.WebSocket.Server/)| [![NuGet Download](https://img.shields.io/nuget/dt/SuperSocket.WebSocket.Server.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.WebSocket.Server/) |
| **SuperSocket.Udp** | [![MyGet Version](https://img.shields.io/myget/supersocket/vpre/SuperSocket.Udp)](https://www.myget.org/feed/supersocket/package/nuget/SuperSocket.Udp) | [![NuGet Version](https://img.shields.io/nuget/vpre/SuperSocket.Udp.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Udp/)| [![NuGet Download](https://img.shields.io/nuget/dt/SuperSocket.Udp.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.Udp/) |
-| ~~**SuperSocket.GZip**~~ | [![MyGet Version](https://img.shields.io/myget/supersocket/vpre/SuperSocket.GZip)](https://www.myget.org/feed/supersocket/package/nuget/SuperSocket.GZip) | [![NuGet Version](https://img.shields.io/nuget/vpre/SuperSocket.GZip.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.GZip/)| [![NuGet Download](https://img.shields.io/nuget/dt/SuperSocket.GZip.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.GZip/) |
| **SuperSocket.SerialIO** | [![MyGet Version](https://img.shields.io/myget/supersocket/vpre/SuperSocket.SerialIO)](https://www.myget.org/feed/supersocket/package/nuget/SuperSocket.SerialIO) | [![NuGet Version](https://img.shields.io/nuget/vpre/SuperSocket.SerialIO.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.SerialIO/)| [![NuGet Download](https://img.shields.io/nuget/dt/SuperSocket.SerialIO.svg?style=flat)](https://www.nuget.org/packages/SuperSocket.SerialIO/) |
diff --git a/samples/CommandServer/CommandServer.csproj b/samples/CommandServer/CommandServer.csproj
index 691537923..fb566dce5 100644
--- a/samples/CommandServer/CommandServer.csproj
+++ b/samples/CommandServer/CommandServer.csproj
@@ -7,6 +7,6 @@
-
+
\ No newline at end of file
diff --git a/samples/ConfigSample/ConfigSample.csproj b/samples/ConfigSample/ConfigSample.csproj
index 81bc171bc..57610d9b5 100644
--- a/samples/ConfigSample/ConfigSample.csproj
+++ b/samples/ConfigSample/ConfigSample.csproj
@@ -6,7 +6,7 @@
-
+
diff --git a/samples/EchoServer/EchoServer.csproj b/samples/EchoServer/EchoServer.csproj
index 8d341cbbd..7aff403e3 100644
--- a/samples/EchoServer/EchoServer.csproj
+++ b/samples/EchoServer/EchoServer.csproj
@@ -6,6 +6,6 @@
-
+
diff --git a/samples/LiveChat/LiveChat.csproj b/samples/LiveChat/LiveChat.csproj
index 1c9cd4519..624a7db84 100644
--- a/samples/LiveChat/LiveChat.csproj
+++ b/samples/LiveChat/LiveChat.csproj
@@ -17,7 +17,7 @@
-
+
diff --git a/src/SuperSocket.Client/SuperSocket.Client.csproj b/src/SuperSocket.Client/SuperSocket.Client.csproj
index 920d011ec..aaa53a29a 100644
--- a/src/SuperSocket.Client/SuperSocket.Client.csproj
+++ b/src/SuperSocket.Client/SuperSocket.Client.csproj
@@ -6,7 +6,7 @@
$(TargetFrameworks);$(MobileTargetFrameworks)
-
+
diff --git a/src/SuperSocket.Command/SuperSocket.Command.csproj b/src/SuperSocket.Command/SuperSocket.Command.csproj
index 614db2e33..eb1c4ecea 100644
--- a/src/SuperSocket.Command/SuperSocket.Command.csproj
+++ b/src/SuperSocket.Command/SuperSocket.Command.csproj
@@ -3,11 +3,11 @@
SuperSocket command pattern library which allow you to handle requests with commands.
-
-
-
-
-
+
+
+
+
+
diff --git a/src/SuperSocket.Connection/SuperSocket.Connection.csproj b/src/SuperSocket.Connection/SuperSocket.Connection.csproj
index 3a05b8528..d2c02bdab 100644
--- a/src/SuperSocket.Connection/SuperSocket.Connection.csproj
+++ b/src/SuperSocket.Connection/SuperSocket.Connection.csproj
@@ -6,9 +6,9 @@
$(TargetFrameworks);$(MobileTargetFrameworks)
-
-
-
+
+
+
diff --git a/src/SuperSocket.Kestrel/SuperSocket.Kestrel.csproj b/src/SuperSocket.Kestrel/SuperSocket.Kestrel.csproj
index 0df674713..809cfb979 100644
--- a/src/SuperSocket.Kestrel/SuperSocket.Kestrel.csproj
+++ b/src/SuperSocket.Kestrel/SuperSocket.Kestrel.csproj
@@ -1,6 +1,6 @@
- net6.0;net7.0;net8.0
+ $(DotNetTargetFrameworks)
SuperSocket library allows users to take advantage of Kestrel's high performance socket pipeline.
diff --git a/src/SuperSocket.Primitives/SuperSocket.Primitives.csproj b/src/SuperSocket.Primitives/SuperSocket.Primitives.csproj
index b79d54171..4d700e6b0 100755
--- a/src/SuperSocket.Primitives/SuperSocket.Primitives.csproj
+++ b/src/SuperSocket.Primitives/SuperSocket.Primitives.csproj
@@ -6,8 +6,8 @@
SuperSocket primitive interfaces and classes.
-
-
+
+
diff --git a/src/SuperSocket.Server.Abstractions/SuperSocket.Server.Abstractions.csproj b/src/SuperSocket.Server.Abstractions/SuperSocket.Server.Abstractions.csproj
index be3bcc208..53167fb78 100644
--- a/src/SuperSocket.Server.Abstractions/SuperSocket.Server.Abstractions.csproj
+++ b/src/SuperSocket.Server.Abstractions/SuperSocket.Server.Abstractions.csproj
@@ -3,7 +3,7 @@
SuperSocket library for server abstractions. It includes many interfaces and base implementation of SuperSocket server components. Users can extend server side base on this project.
-
+
diff --git a/src/SuperSocket.Server/SuperSocket.Server.csproj b/src/SuperSocket.Server/SuperSocket.Server.csproj
index 059ea36de..5b361f963 100755
--- a/src/SuperSocket.Server/SuperSocket.Server.csproj
+++ b/src/SuperSocket.Server/SuperSocket.Server.csproj
@@ -12,15 +12,15 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/test/SuperSocket.Benchmarks/SuperSocket.Benchmarks.csproj b/test/SuperSocket.Benchmarks/SuperSocket.Benchmarks.csproj
index 56f2a9147..f3d672c97 100644
--- a/test/SuperSocket.Benchmarks/SuperSocket.Benchmarks.csproj
+++ b/test/SuperSocket.Benchmarks/SuperSocket.Benchmarks.csproj
@@ -5,8 +5,8 @@
false
-
-
+
+
diff --git a/test/SuperSocket.Tests/PerfTest.cs b/test/SuperSocket.Tests/PerfTest.cs
new file mode 100644
index 000000000..6d7bc8ddd
--- /dev/null
+++ b/test/SuperSocket.Tests/PerfTest.cs
@@ -0,0 +1,86 @@
+using System;
+using System.IO;
+using System.Linq;
+using System.Net.Sockets;
+using System.Threading;
+using System.Threading.Tasks;
+using SuperSocket.ProtoBase;
+using SuperSocket.Server;
+using SuperSocket.Server.Host;
+using Xunit;
+using Xunit.Abstractions;
+
+namespace SuperSocket.Tests
+{
+ public class PerfTest : TestClassBase
+ {
+ public PerfTest(ITestOutputHelper outputHelper)
+ : base(outputHelper)
+ {
+ }
+
+ [Theory]
+ [InlineData(typeof(RegularHostConfigurator))]
+ [InlineData(typeof(SecureHostConfigurator))]
+ [InlineData(typeof(KestralConnectionHostConfigurator))]
+ public async Task ConcurrentSendReceive(Type hostConfiguratorType)
+ {
+ var hostConfigurator = CreateObject(hostConfiguratorType);
+ var connectionCount = 10;
+ var runTime = TimeSpan.FromMinutes(1);
+
+ using (var server = CreateSocketServerBuilder(hostConfigurator)
+ .UsePackageHandler(async (s, p) =>
+ {
+ await s.SendAsync(Utf8Encoding.GetBytes(p.Text + "\r\n"));
+ }).BuildAsServer())
+ {
+ Assert.Equal("TestServer", server.Name);
+
+ Assert.True(await server.StartAsync());
+ OutputHelper.WriteLine("Started.");
+
+ using var cancellationTokenSource = new CancellationTokenSource();
+
+ var tasks = Enumerable
+ .Range(0, connectionCount)
+ .Select(_ => RunConnectionAsync(hostConfigurator, cancellationTokenSource.Token))
+ .ToArray();
+
+ cancellationTokenSource.CancelAfter(runTime);
+
+ await Task.Delay(runTime);
+
+ var rounds = await Task.WhenAll(tasks).WaitAsync(TimeSpan.FromSeconds(10));
+
+ OutputHelper.WriteLine($"Total rounds: {rounds.Sum()}.");
+ }
+ }
+
+ private async Task RunConnectionAsync(IHostConfigurator hostConfigurator, CancellationToken cancellationToken)
+ {
+ var round = 0;
+
+ using (var socket = hostConfigurator.CreateClient())
+ using (var clientStream = await hostConfigurator.GetClientStream(socket))
+ using (var streamReader = new StreamReader(clientStream, Utf8Encoding, true))
+ using (var streamWriter = new StreamWriter(clientStream, Utf8Encoding, 1024 * 1024 * 4))
+ {
+ while (!cancellationToken.IsCancellationRequested)
+ {
+ var text = Guid.NewGuid().ToString();
+
+ await streamWriter.WriteAsync($"{text}\r\n".AsMemory());
+ await streamWriter.FlushAsync();
+
+ var line = await streamReader.ReadLineAsync();
+ Assert.Equal(text, line);
+
+ round++;
+ }
+ }
+
+ return round;
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/SuperSocket.Tests/SuperSocket.Tests.csproj b/test/SuperSocket.Tests/SuperSocket.Tests.csproj
index 8e510cc2c..d0a768774 100755
--- a/test/SuperSocket.Tests/SuperSocket.Tests.csproj
+++ b/test/SuperSocket.Tests/SuperSocket.Tests.csproj
@@ -15,13 +15,13 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+