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" />
                    
Directory.Packages.props
<PackageReference Include="mgzhenhong.ASW2.Net" />
                    
Project file
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
                    
#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
                    
Install as a Cake Addin
#tool nuget:?package=mgzhenhong.ASW2.Net&version=2.1.3
                    
Install as a Cake Tool

ASW.Net

License .NET NuGet

📖 项目简介

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}");
};

🔧 扩展开发

自定义协议开发指南

  1. 实现IProtocol接口
  2. 创建编码器和解码器
  3. 实现业务处理器
  4. 配置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 文件。

🔗 相关项目

Product 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.

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