mgzhenhong.ASW2.Net
2.1.3
dotnet add package mgzhenhong.ASW2.Net --version 2.1.3
NuGet\Install-Package mgzhenhong.ASW2.Net -Version 2.1.3
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="mgzhenhong.ASW2.Net" Version="2.1.3" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="mgzhenhong.ASW2.Net" Version="2.1.3" />
<PackageReference Include="mgzhenhong.ASW2.Net" />
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add mgzhenhong.ASW2.Net --version 2.1.3
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: mgzhenhong.ASW2.Net, 2.1.3"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package mgzhenhong.ASW2.Net@2.1.3
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=mgzhenhong.ASW2.Net&version=2.1.3
#tool nuget:?package=mgzhenhong.ASW2.Net&version=2.1.3
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
ASW.Net
📖 项目简介
ASW.Net 是一个基于 .NET 的高性能网络通信框架,构建在 DotNetty 之上,提供了TCP服务器和客户端的完整解决方案。该框架支持多种通信协议,包括HTTP、WebSocket、Modbus、RDC等,具备高并发、低延迟、易扩展的特点。
✨ 核心特性
🚀 高性能网络通信
- 基于DotNetty: 利用Netty的异步非阻塞IO模型,支持高并发连接
- 零拷贝: 优化的内存管理,减少不必要的数据拷贝
- 连接池管理: 智能的连接生命周期管理
- 流量控制: 支持发送缓冲区监控和背压处理
🔌 多协议支持
- 原始字节流:
RawBytesProtocol- 直接传输字节数据 - 文本协议:
TextProtocol/LineProtocol- 文本消息传输 - JSON协议:
JsonProtocol- JSON格式消息 - 固定长度:
FixedLengthProtocol- 固定长度消息帧 - 帧协议:
FrameProtocol- 带长度头的消息帧 - HTTP协议: 完整的HTTP服务器和客户端支持
- WebSocket: 实时双向通信
- Modbus: 工业自动化标准协议
- RDC: 自研的可靠数据通信协议
🔧 易于扩展
- 协议插件化: 通过
IProtocol接口轻松实现自定义协议 - 泛型设计: 支持强类型的发送和接收数据类型定义
- 事件驱动: 丰富的事件回调支持
- 中间件: 支持自定义ChannelHandler处理链
🛡️ 企业级特性
- SSL/TLS: 完整的安全传输层支持
- 连接监控: 实时连接状态和流量统计
- 错误处理: 完善的异常处理和恢复机制
- 日志集成: 集成的网络日志和调试支持
🏗️ 架构设计
框架架构
┌─────────────────────────────────────────────────────────────┐
│ ASW.Net 框架 │
├─────────────────────────────────────────────────────────────┤
│ TcpServer<T,T,T> │ TcpClient<T,T,T> │ Protocols │
│ ├─ 连接管理 │ ├─ 自动重连 │ ├─ HTTP │
│ ├─ 流量控制 │ ├─ 状态管理 │ ├─ WebSocket│
│ ├─ 事件分发 │ ├─ 超时控制 │ ├─ Modbus │
│ └─ SSL支持 │ └─ SSL支持 │ ├─ RDC │
│ │ │ └─ Custom │
├─────────────────────────────────────────────────────────────┤
│ 协议处理层 │
│ IProtocol │ IChannelHandler │ BytesCounterHandler │
├─────────────────────────────────────────────────────────────┤
│ DotNetty 底层 │
│ EventLoop │ Bootstrap │ Channel │ Pipeline │
└─────────────────────────────────────────────────────────────┘
连接生命周期
graph TB
A[创建连接] --> B[初始化Channel]
B --> C[配置SSL]
C --> D[添加协议处理器]
D --> E[连接建立]
E --> F[数据传输]
F --> G{连接状态}
G -->|正常| F
G -->|错误| H[错误处理]
G -->|断开| I[清理资源]
H --> J{是否重连}
J -->|是| A
J -->|否| I
🚀 快速开始
安装
# Package Manager
Install-Package mgzhenhong.ASW.Net
# .NET CLI
dotnet add package mgzhenhong.ASW.Net
# PackageReference
<PackageReference Include="mgzhenhong.ASW.Net" Version="x.x.x" />
TCP服务器
using ASW.Net;
using ASW.Net.Protocols;
// 创建TCP服务器(使用泛型指定数据类型和协议)
var server = new TcpServer<string, string>(8080, new TextProtocol());
server.Name = "MyTcpServer";
// 事件订阅
server.Connected += connection => {
Console.WriteLine($"客户端连接: {connection.RemoteEndPoint}");
};
server.MessageReceived += (connection, message) => {
Console.WriteLine($"收到消息: {message}");
// 回显消息
connection.Send($"Echo: {message}");
};
server.Closed += connection => {
Console.WriteLine($"客户端断开: {connection.RemoteEndPoint}");
};
// 启动服务器
await server.StartAsync();
Console.WriteLine($"服务器已启动,监听端口: {server.BoundEndPoint}");
TCP客户端
using ASW.Net;
using ASW.Net.Protocols;
// 创建TCP客户端(使用泛型指定数据类型和协议)
var client = new TcpClient<string, string>("127.0.0.1", 8080, new TextProtocol());
client.Name = "MyTcpClient";
// 自动重连配置
client.AutoReconnectIsEnabled = true;
client.AutoReconnectDelayMs = 3000;
// 事件订阅
client.Connected += connection => {
Console.WriteLine("连接成功");
// 发送欢迎消息
connection.Send("Hello Server!");
};
client.MessageReceived += (connection, message) => {
Console.WriteLine($"收到服务器消息: {message}");
};
client.Closed += connection => {
Console.WriteLine("连接断开");
};
// 连接服务器
client.Connect();
📚 协议详解
内置协议
原始字节协议
// 直接传输字节数据,无任何处理(默认协议)
var server = new TcpServer(8080); // 默认使用RawBytesProtocol
// 或者显式指定
var server2 = new TcpServer<byte[], byte[]>(8080, new RawBytesProtocol());
文本协议
// UTF-8编码的文本消息,以换行符分隔
var server = new TcpServer<string, string>(8080, new TextProtocol());
// 或者使用行协议(简化版本)
var server = new TcpServer<string, string>(8080, new LineProtocol());
JSON协议
// 自动序列化/反序列化JSON消息(需要指定泛型类型)
var server = new TcpServer<MyObject, MyObject>(8080, new JsonProtocol<MyObject>());
server.MessageReceived += (connection, obj) => {
// obj 已经是反序列化后的对象
Console.WriteLine($"收到对象: {obj.Name}");
};
固定长度协议
// 固定长度协议(默认256字节,可以继承自定义)
var server = new TcpServer<byte[], byte[]>(8080, new FixedLengthProtocol());
// 自定义固定长度
public class Custom100ByteProtocol : FixedLengthProtocol
{
public override int FixedLength => 100;
}
var customServer = new TcpServer<byte[], byte[]>(8080, new Custom100ByteProtocol());
帧协议
// 消息格式: [4字节长度][数据内容]
var server = new TcpServer<byte[], byte[]>(8080, new FrameProtocol());
// 自定义帧协议设置
var frameProtocol = new FrameProtocol {
LengthFieldLength = 4, // 长度字段4字节
LengthFieldIncludsLengthFieldLength = true, // 长度包含头部
MaxReceivePackageSize = 1024 * 1024 // 最大1MB
};
var customServer = new TcpServer<byte[], byte[]>(8080, frameProtocol);
自定义协议
public class MyCustomProtocol : IProtocol
{
public (string handerName, IChannelHandler handler)[] GetChannelHandlers(ITcpStation station, IChannel channel)
{
return new[]
{
("myEncoder", new MyEncoder()),
("myDecoder", new MyDecoder()),
("myHandler", new MyBusinessHandler(station))
};
}
}
// 自定义编码器
public class MyEncoder : MessageToByteEncoder<MyMessage>
{
protected override void Encode(IChannelHandlerContext context, MyMessage message, IByteBuffer output)
{
// 实现自定义编码逻辑
var data = Encoding.UTF8.GetBytes(message.Content);
output.WriteInt(data.Length);
output.WriteBytes(data);
}
}
// 自定义解码器
public class MyDecoder : ByteToMessageDecoder
{
protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List<object> output)
{
// 实现自定义解码逻辑
if (input.ReadableBytes < 4) return;
var length = input.ReadInt();
if (input.ReadableBytes < length) {
input.ResetReaderIndex();
return;
}
var data = new byte[length];
input.ReadBytes(data);
var content = Encoding.UTF8.GetString(data);
output.Add(new MyMessage { Content = content });
}
}
🔧 高级功能
SSL/TLS支持
// 服务器SSL配置
var certificate = new X509Certificate2("server.pfx", "password");
var server = new TcpServer(8443, new TextProtocol());
server.UseSsl(certificate);
// 客户端SSL配置
var client = new TcpClient("127.0.0.1", 8443, new TextProtocol());
client.UseSsl("server.domain.com"); // 服务器域名用于证书验证
连接配置
// 服务器配置
var server = new TcpServer<string, string>(8080, new TextProtocol());
server.EnableClientTcpNodelay(true); // 禁用Nagle算法(低延迟)
server.EnableClientKeepAlive(true); // 启用Keep-Alive
server.SetClientReceiveBufferSize(64 * 1024); // 接收缓冲区64KB
server.SetClientSendBufferSize(64 * 1024); // 发送缓冲区64KB
// 客户端配置
var client = new TcpClient<string, string>("127.0.0.1", 8080, new TextProtocol());
client.EnableTcpNodelay(true); // 禁用Nagle算法
client.EnableKeepAlive(false); // 使用心跳包代替系统Keep-Alive
client.SetConnectTimeout(10000); // 连接超时10秒
流量监控
server.SendBufferFull += connection => {
Console.WriteLine($"连接 {connection.Id} 发送缓冲区满");
// 可以暂停数据发送或断开连接
};
server.SendBufferDrain += connection => {
Console.WriteLine($"连接 {connection.Id} 发送缓冲区可写");
// 可以恢复数据发送
};
// 获取流量统计
var stats = server.GetNetworkStatistics();
Console.WriteLine($"发送字节数: {stats.BytesSent}");
Console.WriteLine($"接收字节数: {stats.BytesReceived}");
连接管理
// 获取所有连接
var connections = server.GetAllConnections();
Console.WriteLine($"当前连接数: {connections.Length}");
// 向所有连接广播消息
server.BroadCast("广播消息");
// 按条件广播
server.BroadCast("特定消息", conn => conn.Name.StartsWith("VIP"));
// 根据条件查找连接
var targetConnections = server.GetAllConnections(c => c.Name == "特定客户端");
if (targetConnections.Length > 0) {
targetConnections[0].Send("特定消息");
}
// 断开特定连接
await targetConnections[0].CloseAsync();
// 关闭所有连接
server.CloseAll();
🏭 Modbus协议支持
Modbus TCP
using ASW.Net.Protocols.Modbus;
// Modbus服务器(使用实际存在的类)
var modbusServer = new ModbusTcpServer(502);
// 注意:具体的事件处理需要根据实际API实现
var modbusServer2 = new ModbusTcpServer(); // 使用默认端口502
// Modbus客户端开发需要查看具体的实现类
// 建议查看ASW.Net.Protocols.Modbus命名空间下的具体实现
RDC协议
// RDC是ASW框架的自研协议,提供可靠的请求-响应机制
// 具体实现请查看ASW.Net.Protocols.Rdc命名空间
// 建议参考ASW.Net.EventChannel项目中对RDC协议的使用示例
📊 性能基准
吞吐量测试
测试环境: Intel i7-8700K, 16GB RAM, Windows 10
网络环境: 本地回环 (127.0.0.1)
原始字节协议:
- 单连接吞吐量: 800MB/s
- 1000并发连接: 500MB/s
- 消息延迟: < 1ms
文本协议:
- 单连接吞吐量: 600MB/s
- 消息处理: 100,000 msg/s
- 消息延迟: < 2ms
JSON协议:
- 对象处理: 50,000 obj/s
- 序列化开销: ~20%
- 消息延迟: < 5ms
内存使用
空载服务器: ~15MB
1000个连接: ~50MB
每个连接开销: ~35KB
连接池缓存: 可配置
并发能力
最大并发连接: 10,000+ (取决于系统资源)
连接建立速度: 1,000 conn/s
断开连接速度: 2,000 conn/s
🐛 故障排除
常见问题
Q: 连接数量达到上限?
// 检查系统资源限制
// Windows: netsh int ipv4 show dynamicport tcp
// 调整连接池配置或使用连接复用
Q: 消息发送失败?
// 检查发送缓冲区状态
connection.SendBufferFull += () => {
// 缓冲区满,等待或断开连接
};
// 同步发送
connection.Send(message);
// 或者异步发送
try {
await connection.SendAsync(message);
} catch (Exception ex) {
logger.LogError(ex, "发送消息失败");
}
Q: 内存泄漏?
// 确保正确释放资源
// TcpServer和TcpClient不实现IDisposable,使用Stop()方法
var server = new TcpServer<string, string>(8080, new TextProtocol());
// 使用完毕后
server.Stop();
// 客户端释放
client.Close(true); // 参数true表示关闭后释放资源
调试技巧
// 启用网络日志
var server = new TcpServer<string, string>(8080, new TextProtocol());
server.UseNettyLog("MyServer");
// 自定义错误处理
server.Error += (connection, ex) => {
logger.LogError(ex, $"连接 {connection.Id} 发生错误");
};
// 监控连接状态
server.StateChanged += (oldState, newState) => {
logger.LogInformation($"服务器状态变化: {oldState} -> {newState}");
};
🔧 扩展开发
自定义协议开发指南
- 实现IProtocol接口
- 创建编码器和解码器
- 实现业务处理器
- 配置ChannelHandler链
// 完整的自定义协议示例
public class MyProtocol : IProtocol
{
public (string handerName, IChannelHandler handler)[] GetChannelHandlers(ITcpStation station, IChannel channel)
{
return new[]
{
// 日志处理器(可选)
("logger", new LoggingHandler(LogLevel.Debug)),
// 自定义解码器
("decoder", new MyDecoder()),
// 自定义编码器
("encoder", new MyEncoder()),
// 业务处理器
("handler", new MyBusinessHandler(station))
};
}
}
中间件开发
// 认证中间件
public class AuthenticationHandler : ChannelHandlerAdapter
{
public override void ChannelRead(IChannelHandlerContext context, object message)
{
if (IsAuthenticated(context.Channel)) {
// 已认证,继续处理
context.FireChannelRead(message);
} else {
// 未认证,发送认证请求
context.WriteAndFlushAsync(new AuthRequest());
}
}
}
// 限流中间件
public class RateLimitHandler : ChannelHandlerAdapter
{
private readonly IRateLimiter rateLimiter;
public override void ChannelRead(IChannelHandlerContext context, object message)
{
if (rateLimiter.TryAcquire()) {
context.FireChannelRead(message);
} else {
// 限流,丢弃消息或发送错误响应
context.WriteAndFlushAsync(new RateLimitExceededResponse());
}
}
}
🤝 贡献
欢迎提交Issue和Pull Request来改进这个项目。
📄 许可证
本项目基于 MIT 许可证开源。详见 LICENSE 文件。
🔗 相关项目
- ASW.MessageQueue - 基于ASW.Net构建的消息队列
- ASW.Net.EventChannel - 事件通道扩展
- ASW.Utility - 通用工具库
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
net10.0
- DotNetty.Codecs.Http (>= 0.7.6)
- DotNetty.Handlers (>= 0.7.6)
- DotNetty.Transport (>= 0.7.6)
- mgzhenhong.ASW2.Utility (>= 2.1.3)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on mgzhenhong.ASW2.Net:
| Package | Downloads |
|---|---|
|
mgzhenhong.ASW2.MessageQueue
ASW.MessageQueue |
|
|
mgzhenhong.ASW2.Net.EventChannel
ASW.Net.EventChannel |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.1.3 | 121 | 5/11/2026 |
| 2.1.2 | 128 | 5/9/2026 |
| 2.1.1 | 126 | 4/15/2026 |
| 2.0.43 | 164 | 3/7/2026 |
| 2.0.42 | 132 | 3/6/2026 |
| 2.0.41 | 169 | 2/6/2026 |
| 2.0.40 | 173 | 2/4/2026 |
| 2.0.39 | 155 | 2/4/2026 |
| 2.0.38 | 151 | 2/3/2026 |
| 2.0.37 | 158 | 2/1/2026 |
| 2.0.36 | 172 | 2/1/2026 |
| 2.0.35 | 170 | 2/1/2026 |
| 2.0.34 | 168 | 2/1/2026 |
| 2.0.33 | 170 | 1/31/2026 |
| 2.0.32 | 166 | 1/30/2026 |
| 2.0.31 | 172 | 1/22/2026 |
| 2.0.30 | 165 | 1/22/2026 |
| 2.0.29 | 159 | 1/21/2026 |
| 2.0.28 | 155 | 1/20/2026 |
| 2.0.27 | 167 | 1/12/2026 |
Loading failed