文章目录
一、说明
二、待测试产品、环境
2.1 Socket产品
有其他建议请联系我
- HPSocket.Net
- SuperSocket
- RRQMSocket
项目 | SuperSocket | HPSocket.Net | RRQMSocket |
---|---|---|---|
Gitee | Gitee | Gitee | Gitee |
Github | Github | Github | Github |
Gitee Demo | Demo | Demo | Demo |
Github Demo | Demo | Demo | Demo |
2.2 测试物理机
三、测试
3.1 服务器测试项目配置
3.2 TCP服务器测试参数配置
【SuperSocket】
版本:SuperSocket.Engine 1.6.6.1
AppServer appServer = new AppServer();
var config = new SuperSocket.SocketBase.Config.ServerConfig()
{
ClearIdleSession = true, //60秒执行一次清理90秒没数据传送的连接
ClearIdleSessionInterval = 60,
IdleSessionTimeOut = 90,
MaxRequestLength = 1024*64, //最大包长度
Ip = "Any",
Port = 7789,
ListenBacklog = 1000,
MaxConnectionNumber = 10000,
};
appServer.Setup(config);
appServer.Start();
【HPSocket】
版本:HPSocket.Net 5.8.5.5
TcpServer tcpServer = new TcpServer();
tcpServer.MaxConnectionCount = 10000;
tcpServer.SocketListenQueue = 1000;
tcpServer.Port = 7789;
tcpServer.Start();
【RRQMSocket】
版本:RRQMSocket 6.5.0
BytePool.SetBlockSize(1024, 1024 * 1024 * 10);//重新指定内存池最大、最小值分配。
TcpService service = new TcpService();
var config = new TcpServiceConfig();
config.ListenIPHosts = new IPHost[] { new IPHost("127.0.0.1:7789")};
config.MaxCount = 10000;
config.BufferLength = 1024;
//config.BufferLength = 1024*64;//此处设置在测试流量时生效
config.Backlog = 1000;
service.Setup(config);
service.Start();
3.3 测试一
【客户端代码】
static IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7789);
static Socket GetSocket()
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(endPoint);
return socket;
}
static void Test01()
{
TimeSpan time = TimeSpan.Zero;
for (int i = 0; i < 10; i++)
{
TimeSpan timeSpan = RRQMCore.Diagnostics.TimeMeasurer.Run(() =>
{
List<Socket> sockets = new List<Socket>();
for (int j = 0; j < 1000; j++)
{
sockets.Add(GetSocket());
}
foreach (var item in sockets)
{
item.Dispose();
}
});
time += timeSpan;
Console.WriteLine(timeSpan);
}
Console.WriteLine($"总用时:{time}");
}
【SuperSocket】
【HPSocket.Net】
【RRQMSocket】
3.4 测试二
【客户端代码】
static void Test02()
{
stopwatch = new Stopwatch();
List<List<Socket>> socketsCollection = new List<List<Socket>>();
for (int i = 0; i < 10; i++)
{
List<Socket> sockets = new List<Socket>();
for (int j = 0; j < 1000; j++)
{
sockets.Add(GetSocket());
}
socketsCollection.Add(sockets);
}
stopwatch.Start();
foreach (var item in socketsCollection)
{
SocketSend(item);
}
}
static void SocketSend(List<Socket> sockets)
{
byte[] data = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Task.Run(() =>
{
TimeSpan timeSpan = RRQMCore.Diagnostics.TimeMeasurer.Run(() =>
{
for (int i = 0; i < 1000; i++)
{
try
{
foreach (var item in sockets)
{
item.Send(data);
}
}
catch (Exception ex)
{
Console.WriteLine($"异常退出,{ex.Message}");
break;
}
}
});
ShowTime(timeSpan);
});
}
static Stopwatch stopwatch;
static void ShowTime(TimeSpan timeSpan)
{
Console.WriteLine($"当前用时:{timeSpan},当前总用时:{stopwatch.Elapsed}");
}
【SuperSocket】
【HPSocket】
【RRQMSocket】
3.5 测试三
注意:本轮测试中,RRQMSocket需要修改一下BufferLength参数,因为该参数会作为申请内存池的基数,所以为避免内存碎片化,需要将BufferLength调整至641024。*
【SuperSocket】
【HPSocket】
【RRQMSocket】
四、综合功能及特性
功能 | SuperSocket | HPSocket.Net | RRQMSocket |
---|---|---|---|
开源 | 是 | 是 | 是 |
免费商业 | 是 | 是 | 是 |
.Net 跨平台性 | 正式版不完全具备,Bate版支持 | 依托C++支持 | 基本完全支持 |
完全跨平台性 | 依托.Net Core跨平台 | 依托C++跨平台 | 依托.Net Core跨平台 |
依赖程度 | 依赖较严重 | 无依赖 | 仅依赖RRQMCore |
应用限制 | 基本无限制 | 受限与不同CPU类型的运行版本,从而不适合UWP转换打包等 | 基本无限制 |
问题生态链 | 比较完整,遇到问题能很快百度到 | 比较完整,遇到问题能很快百度到 | 新出时间较短,直接搜索比较困难,但是可以直接提Issue解决 |
是否有视频新手教程 | 无官方教程 | 无官方教程 | B站有视频 |
二次开发容易程度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
代码规范度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
文档完整度 | ⭐⭐⭐ | ⭐ | ⭐⭐⭐⭐ |
五、最后结语
因为我是RRQMSocket的作者,所以难免会对自家产品有诸多赞扬,但是实际上我知道,RRQMSocket还有很长的路要走,好的产品只有经过时间和更多人的考验,才能淘沙出金。所以希望本篇测评,能该您一个建议,也能给RRQMSocket一个机会。下次选择Socket的时候,可以考虑一下RRQMSocket哦。
本次测试源码:RRQMPerformanceTest