---
id: fixedheaderpackageadapter
title: 固定包头数据处理适配器
---


## 一、说明

固定包头数据处理适配器是处理粘包、分包问题的最有力、最可靠、最高效、最稳定的一种方案，它基本上适用于**所有场景**。即使**跨语言**使用，也只需要在其他语言中设计**相同算法**就可以。

## 二、特点

1. 最有力的解决粘包。分包问题。
2. 是自定义协议的不二选择。
3. 支持指定包头长度，Byte、Ushort、Int三种类型作为包头。
4. 最好在客户端与服务器均使用TouchSocket组件时使用。不然就需要非TouchSocket的一方适配包头算法。

## 三、协议算法

- Byte包头算法：以第一个字节作为后续整个数据的长度，整个数据长度区间为[0,255]。
- Ushort包头算法：前2个字节，且为[默认端序（小端）](./touchsocketbitconverter.mdx#四默认端)的排列，作为后续整个数据的长度，整个数据长度区间为[0,65535]。
- Int包头算法（默认配置）：前4个字节，且为[默认端序（小端）](./touchsocketbitconverter.mdx#四默认端)排列，作为后续整个数据的长度，整个数据长度区间为[0,2^31]。


## 四、使用

客户端与服务器均适用。下列以服务器为例。

步骤

1. TouchSocketConfig配置中设置（可以同时指定HeaderType等属性）
2. 通过Received（事件、方法、插件）中的ByteBlock读取数据。

```csharp {10}
TcpService service = new TcpService();
service.Received += (client, byteBlock, requestInfo) =>
{
    //从客户端收到信息
    string mes = Encoding.UTF8.GetString(byteBlock.Buffer, 0, byteBlock.Len);
};

service.Setup(new TouchSocketConfig()//载入配置     
    .SetListenIPHosts(new IPHost[] { new IPHost(7790) })
    .SetDataHandlingAdapter(() => { return new FixedHeaderPackageAdapter() { FixedHeaderType= FixedHeaderType.Int }; }))//配置适配器
    .Start();//启动
```

:::caution 注意

该适配器，在发送（Send、SendAsync）数据时，会自动封装数据头，所以不需要手动封装。如果想要发送手动组装的数据，请使用DefaultSend。

:::  

:::caution 注意

接收的数据长度是byteBlock.Len，而不是byteBlock.Buffer.Length。

:::  

:::tip 提示

该适配器，客户端与服务器均适用。

:::  

## 五、可设置参数

|  属性   | 描述  |默认值  |
|  ----  | ----  |----  |
| MaxPackageSize  | 适配器能接收的最大数据包长度 |1024\*1024\*1024字节|
| CanSendRequestInfo  | 是否允许发送IRequestInfo对象 |false|
| CanSplicingSend  | 拼接发送 |false|
| CacheTimeoutEnable  | 是否启用缓存超时。 |true|
| CacheTimeout  | 缓存超时时间。 |1秒|
| UpdateCacheTimeWhenRev  | 是否在收到数据时，即刷新缓存时间。当设为true时，将弱化CacheTimeout的作用，只要一直有数据，则缓存不会过期。当设为false时，则在CacheTimeout的时效内。必须完成单个缓存的数据 |true|