v11.7.2025.1001 AI重构核心代码;增加ExcelWriter用于导出Excel文件
# IPacket æ•°æ®åŒ…设计文档
## 概述
IPacket 是 NewLife.Core ä¸çš„æ ¸å¿ƒæ•°æ®åŒ…接å£ï¼Œç”¨äºŽé«˜æ€§èƒ½ç½‘络编程和å议解æžã€‚它采用内å˜å…±äº«ç†å¿µï¼Œé€šè¿‡å¯¹è±¡æ± 和链å¼ç»“æž„å®žçŽ°é›¶æ‹·è´æ•°æ®å¤„ç†ï¼Œæ˜¾è‘—é™ä½Žå†…å˜åˆ†é…å’Œ GC 压力。
## 设计ç†å¿µ
### æ ¸å¿ƒåŽŸåˆ™
1. **性能优先**:零拷è´è®¾è®¡ï¼Œå‡å°‘内å˜åˆ†é…
2. **内å˜å‹å¥½**ï¼šä½¿ç”¨å¯¹è±¡æ± å¤ç”¨å†…å˜ï¼Œé™ä½Ž GC 压力
3. **链å¼ç»“æž„**:支æŒå¤šæ®µæ•°æ®åŒ…链接,é¿å…大å—å†…å˜æ‹·è´
4. **所有æƒç®¡ç†**:明确内å˜ç®¡ç†èŒè´£ï¼Œé˜²æ¢å†…å˜æ³„æ¼
### è®¾è®¡ç›®æ ‡
- ç½‘ç»œåº“é›¶æ‹·è´æ•°æ®ä¼ 输
- å议解æžä¸çš„高效数æ®åˆ‡ç‰‡
- å‡å°‘网络编程ä¸çš„内å˜å¼€é”€
- æä¾›ç±»ä¼¼ .NET Core Span/Memory 的功能(兼容 .NET Framework)
## 接å£å®šä¹‰
```csharp
public interface IPacket
{
Int32 Length { get; } // 当剿®µé•¿åº¦
IPacket? Next { get; set; } // 链å¼åŽç»åŒ…
Int32 Total { get; } // 总长度(å«é“¾å¼ï¼‰
Byte this[Int32 index] { get; set; } // 跨链索引访问
Span<Byte> GetSpan(); // 获å–内å˜è§†å›¾
Memory<Byte> GetMemory(); // 获å–内å˜å—
IPacket Slice(Int32 offset, Int32 count = -1);
IPacket Slice(Int32 offset, Int32 count, Boolean transferOwner);
Boolean TryGetArray(out ArraySegment<Byte> segment);
}
```
## 实现类型
### 1. ArrayPacket(结构体)
- **用途**:基于å—节数组的数æ®åŒ…ï¼Œæ— å†…å˜ç®¡ç†å¼€é”€
- **特性**ï¼šå€¼ç±»åž‹ï¼Œæ— GC 分é…,适åˆé¢‘ç¹åˆ›å»º
- **场景**:已有数组的数æ®åˆ‡ç‰‡ï¼Œå议解æž
```csharp
var packet = new ArrayPacket(buffer, offset, length);
var slice = packet.Slice(10, 20); // 零分é…切片
```
### 2. OwnerPacket(类)
- **用途**:具有所有æƒç®¡ç†çš„æ•°æ®åŒ…,使用 ArrayPool
- **特性**:支æŒå†…å˜æ± ,自动释放,å¯è½¬ç§»æ‰€æœ‰æƒ
- **场景**:需è¦ç”³è¯·æ–°ç¼“冲区的场景
```csharp
using var packet = new OwnerPacket(1024); // ä»Žæ± ä¸ç”³è¯·
var slice = packet.Slice(0, 512, transferOwner: true); // 转移所有æƒ
```
### 3. MemoryPacket(结构体)
- **用途**:基于 Memory<Byte> 的数æ®åŒ…
- **特性**:å¯èƒ½æ¥è‡ªå†…å˜æ± ï¼Œæ— å†…å˜ç®¡ç†è´£ä»»
- **场景**:与现有 Memory 系统集æˆ
## 扩展方法 (PacketHelper)
### 链弿“作
```csharp
IPacket chain = packet1
.Append(packet2)
.Append(dataBytes);
```
### æ•°æ®è½¬æ¢
```csharp
// å—符串转æ¢ï¼ˆæ”¯æŒå¤šåŒ…链)
string text = packet.ToStr(Encoding.UTF8, offset: 10, count: 100);
// åå…进制显示(调试å‹å¥½ï¼‰
string hex = packet.ToHex(maxLength: 32, separator: " ", groupSize: 4);
```
### æµæ“作
```csharp
// åŒæ¥å¤åˆ¶
packet.CopyTo(stream);
// 异æ¥å¤åˆ¶
await packet.CopyToAsync(stream, cancellationToken);
// 获å–独立æµ
using var stream = packet.GetStream();
```
### æ•°æ®è¯»å–
```csharp
// 读å–å—节数组
byte[] data = packet.ReadBytes(offset: 10, count: 20);
// 深度克隆
IPacket clone = packet.Clone();
// 转æ¢ä¸ºæ•°ç»„段
ArraySegment<byte> segment = packet.ToSegment();
IList<ArraySegment<byte>> segments = packet.ToSegments();
```
### 头部扩展
```csharp
// å议头填充(优先å¤ç”¨çŽ°æœ‰ç¼“å†²åŒºï¼‰
IPacket withHeader = packet.ExpandHeader(headerSize: 4);
```
## 内å˜ç®¡ç†æ¨¡å¼
### 所有æƒè½¬ç§»è§„则
1. **接收方负责释放**:获得数æ®åŒ…的一方负责最终释放
2. **啿¬¡è½¬ç§»**:所有æƒåªèƒ½è½¬ç§»ä¸€æ¬¡ï¼Œé¿å…é‡å¤é‡Šæ”¾
3. **链å¼ç»§æ‰¿**ï¼šè½¬ç§»æ‰€æœ‰æƒæ—¶ï¼ŒNext 链一åŒè½¬ç§»
### 生命周期管ç†
```csharp
// 申请与自动释放
using var packet = new OwnerPacket(size);
// 手动释放
if (packet is IOwnerPacket owner)
owner.Dispose();
// 扩展方法释放
packet.TryDispose();
```
## 性能优化ç–ç•¥
### å•包快速路径
- 啿®µæ•°æ®ç›´æŽ¥æ“作,é¿å…链表é历
- Span é›¶æ‹·è´è§†å›¾è®¿é—®
- 直接内å˜ç¼–ç 转æ¢
### 多包链å¼å¤„ç†
- StringBuilder æ± åŒ–æ‹¼æŽ¥
- 全局åç§»é‡è®¡ç®—
- 延迟内å˜åˆ†é…
### 防护机制
- 环路检测é¿å…æ»å¾ªçޝ
- è¾¹ç•Œæ ¡éªŒé˜²æ¢è¶Šç•Œ
- 傿•°è§„范化处ç†å¼‚常输入
## 使用场景
### 网络编程
```csharp
// 接收数æ®
var packet = await socket.ReceivePacketAsync();
// å议解æž
var header = packet.Slice(0, 4);
var payload = packet.Slice(4);
// å“应数æ®
var response = headerPacket.Append(bodyPacket);
await socket.SendPacketAsync(response);
```
### å议实现
```csharp
// HTTP å议解æž
var lines = packet.ToStr().Split('\n');
var bodyStart = packet.IndexOf("\r\n\r\n".GetBytes()) + 4;
var body = packet.Slice(bodyStart);
```
### æ•°æ®å¤„ç†ç®¡é“
```csharp
// 链å¼å¤„ç†
var result = inputPacket
.Decrypt() // 解密
.Decompress() // 解压
.ParseProtocol() // å议解æž
.Process(); // 业务处ç†
```
## 注æ„事项
### 安全使用
1. **çŸæœŸæŒæœ‰**:Span/Memory 仅在所有æƒç”Ÿå‘½å‘¨æœŸå†…使用
2. **ç¦æ¢ç¼“å˜**:ä¸è¦å°† Span/Memory å˜å‚¨åˆ°å¼‚æ¥ç»“æž„ä¸
3. **åŠæ—¶é‡Šæ”¾**:OwnerPacket 使用åŽåŠæ—¶é‡Šæ”¾æˆ–使用 using
### 性能考虑
1. **é¿å…长链**:过长的包链会影å“é历性能
2. **åˆç†åˆ‡ç‰‡**:频ç¹åˆ‡ç‰‡ä¼šå¢žåŠ å¯¹è±¡åˆ›å»ºå¼€é”€
3. **å¤ç”¨ç¼“冲区**:优先使用 ExpandHeader å¤ç”¨çŽ°æœ‰ç¼“å†²åŒº
### 兼容性
- æ”¯æŒ .NET Framework 4.5+ 到 .NET 9
- 旧版 Packet ç±»å®žçŽ°ç›¸åŒæŽ¥å£ï¼Œä¾¿äºŽæ¸è¿›å¼å‡çº§
- 与现有 Stream/ArraySegment API 良好集æˆ
## 最佳实践
### 创建数æ®åŒ…
```csharp
// 推è:使用结构体é¿å…分é…
IPacket packet = new ArrayPacket(buffer, offset, length);
// éœ€è¦æ‰€æœ‰æƒç®¡ç†æ—¶
using var packet = new OwnerPacket(size);
```
### 链弿“作
```csharp
// 构建å¤åˆæ•°æ®åŒ…
var message = headerPacket
.Append(bodyBytes)
.Append(footerPacket);
```
### 错误处ç†
```csharp
try
{
var data = packet.ReadBytes(offset, count);
}
catch (IndexOutOfRangeException)
{
// 处ç†è¶Šç•Œè®¿é—®
}
finally
{
packet.TryDispose(); // 安全释放
}
```
## 总结
IPacket æŽ¥å£æä¾›äº†é«˜æ€§èƒ½ã€å†…å˜å‹å¥½çš„æ•°æ®åŒ…处ç†èƒ½åŠ›ï¼Œç‰¹åˆ«é€‚åˆç½‘络编程和å议解æžåœºæ™¯ã€‚通过链å¼ç»“构和零拷è´è®¾è®¡ï¼Œå®ƒèƒ½å¤Ÿæ˜¾è‘—é™ä½Žå†…å˜å¼€é”€å’Œ GC 压力,是构建高性能网络应用的é‡è¦åŸºç¡€è®¾æ–½ã€‚
åˆç†ä½¿ç”¨ IPacket çš„å„ç§å®žçŽ°ç±»åž‹å’Œæ‰©å±•æ–¹æ³•ï¼Œèƒ½å¤Ÿåœ¨ä¿è¯æ€§èƒ½çš„åŒæ—¶ï¼Œæä¾›æ¸…晰的内å˜ç®¡ç†è¯ä¹‰å’Œè‰¯å¥½çš„å¼€å‘体验。
|