Skip to content
Back to skills

Hmos Networkboost Kit Netmultipath Network Turbo

ASecurity

实现多网并发网络加速,支持WiFi和蜂窝网络并发传输,通过多Socket绑定不同网络通路实现大文件分片和多文件并发传输,最大支持系统配额限制,适用于大文件上传下载、多文件同步迁移场景

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 22, 2026
developmenttypescriptapi

Works with

  • api

Security analysis

A100/100

Pro scans all 5 files and shows the line behind each finding

Scanned September 22, 2026

npx -y skills add IsKenKenYa/skills --skill hmos-networkboost-kit-netmultipath-network-turbo --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Hmos Networkboost Kit Netmultipath Network Turbo?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Hmos Networkboost Kit Netmultipath Network Turbo
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/iskenkenya-hmos-networkboost-kit-netmultipath-network-turbo/badge)](https://www.skillsdirectory.com/skills/iskenkenya-hmos-networkboost-kit-netmultipath-network-turbo)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: hmos-networkboost-kit-netmultipath-network-turbo
description: 实现多网并发网络加速,支持WiFi和蜂窝网络并发传输,通过多Socket绑定不同网络通路实现大文件分片和多文件并发传输,最大支持系统配额限制,适用于大文件上传下载、多文件同步迁移场景
---

# 多网并发网络加速技能

## 功能描述

本技能实现HarmonyOS的多网并发网络加速能力,通过系统接口同时建立并使用多个网络通路(如WiFi和蜂窝、主卡和副卡),突破单网传输带宽限制,提升网络传输性能。支持两种典型场景:
1. **大文件分片传输**:将大文件分片后通过不同网络通路并发上传/下载,显著提升传输速度
2. **多文件并发传输**:多个文件分配给不同网络通路同时传输,提高整体传输效率

核心流程包括:发起多网请求、监听多网状态、获取NetHandle、绑定Socket到指定网络、并发传输、释放多网资源。

## 使用场景

### 触发词
- "多网并发传输"
- "大文件分片上传"
- "大文件分片下载"
- "多文件并发下载"
- "网络加速"
- "多网并发"

### 能做
- 发起和释放多网并发请求(WiFi+蜂窝或主卡+副卡)
- 监听多网状态变化并获取可用NetHandle
- 将Socket绑定到指定网络通路
- 实现大文件分片并发上传/下载
- 实现多文件并发传输
- 查询多网配额使用情况

### 绝不做
- 不支持指定并发组合(由系统决定)
- 不支持超过配额限制的多网请求
- 不支持跨线程传递Socket和NetHandle对象
- 不处理非网络传输类的加速需求

### 补充
- 需要申请ohos.permission.LINKTURBO受限ACL权限
- 多网请求受系统配额限制(次数和时长)
- 发起多网前需设置业务场景帮助系统管控
- 完成传输后必须释放多网资源
- 仅支持API version 6.0.0(20)及以上

## 调用规范和规则

### 输入约束
- 文件大小:建议单文件不超过200MB(可分片处理)
- 文件数量:建议不超过10个文件并发传输
- 网络状态:至少有2个可用网络通路(WiFi+蜂窝或主卡+副卡)
- 权限要求:已申请ohos.permission.LINKTURBO权限
- 配额限制:需检查多网配额是否充足

### 执行约束
- 最大耗时:单次传输建议不超过30分钟
- 最大迭代次数:文件分片不超过500片
- API调用频次:多网请求不超过系统配额限制
- Socket并发数:不超过可用网络通路数

### 内容约束
- 禁止生成:非HarmonyOS平台的代码、不支持的并发组合
- 禁止使用高危函数:eval、exec、系统命令执行
- 禁止操作:硬编码敏感信息、绕过权限检查

### 降级约束
- 网络失败:回退到单网传输,提示用户网络条件不足
- 文件过大:自动分片处理或提示用户拆分
- 配额耗尽:提示用户等待配额恢复或使用单网传输
- 权限不足:提示用户申请权限,引导至权限配置文档

## 调用流程和步骤

### 步骤1:准备阶段

**前置校验**:
1. 检查API版本要求(>=6.0.0(20))
2. 检查权限配置(ohos.permission.LINKTURBO、ohos.permission.INTERNET)
3. 检查网络状态(至少2个可用网络通路)
4. 检查多网配额是否充足

**权限配置示例**:
```json
{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      },
      {
        "name": "ohos.permission.LINKTURBO"
      },
      {
        "name": "ohos.permission.GET_NETWORK_INFO"
      }
    ]
  }
}
```

### 步骤2:发起多网并发

**设置业务场景**:
```typescript
import { netBoost } from '@kit.NetworkBoostKit';
import { BusinessError } from '@kit.BasicServicesKit';

function setUploadSceneDesc(enter: boolean): boolean {
  try {
    let sceneDesc: netBoost.SceneDesc = {
      scene: 'upload',
      sceneEvent: enter ? netBoost.SceneEvent.SCENE_EVENT_ENTER : netBoost.SceneEvent.SCENE_EVENT_LEAVE
    };
    netBoost.setSceneDesc(sceneDesc);
    return true;
  } catch (err) {
    const error: BusinessError = err as BusinessError;
    console.error(`setSceneDesc Error: ${error.code}, ${error.message}`);
    return false;
  }
}
```

**查询多网配额**:
```typescript
import { netHandover } from '@kit.NetworkBoostKit';
import { BusinessError } from '@kit.BasicServicesKit';

function getMultiPathQuota(): netHandover.MultiPathQuota | undefined {
  try {
    let quota: netHandover.MultiPathQuota = netHandover.getMultiPathQuotaStats();
    console.info(`已使用次数: ${quota.used.count}, 剩余次数: ${quota.remaining.count}`);
    console.info(`已使用时长: ${quota.used.duration}s, 剩余时长: ${quota.remaining.duration}s`);
    return quota;
  } catch (err) {
    const error: BusinessError = err as BusinessError;
    console.error(`getMultiPathQuotaStats Error: ${error.code}, ${error.message}`);
    return undefined;
  }
}
```

**发起多网请求**:
```typescript
function requestMultiPath(): Promise<boolean> {
  return new Promise((resolve) => {
    try {
      netHandover.requestMultiPath((data: netHandover.MultiPathRequestResult) => {
        if (data && data.result === netHandover.MultiPathErrorResult.MULTIPATH_ERROR_NONE) {
          console.info('多网请求成功');
          resolve(true);
        } else {
          console.error(`多网请求失败: ${data.result}`);
          resolve(false);
        }
      });
    } catch (err) {
      const error: BusinessError = err as BusinessError;
      console.error(`requestMultiPath Error: ${error.code}, ${error.message}`);
      resolve(false);
    }
  });
}
```

### 步骤3:监听多网状态

**订阅多网状态变化**:
```typescript
import { connection } from '@kit.NetworkKit';

interface NetHandleChange {
  onMultiNetSuccess: (netHandle: connection.NetHandle) => void;
  onMultiNetRelease: (netHandle: connection.NetHandle) => void;
}

function setOnMultiPathStateChange(netHandleChange: NetHandleChange) {
  try {
    netHandover.on('multiPathStateChange', (data: netHandover.MultiPathStateInfo) => {
      if (data.multiPathState === netHandover.MultiPathState.MULTIPATH_CREATED &&
        data.netHandle.netId >= 100) {
        console.info(`多网创建成功: netId=${data.netHandle.netId}`);
        netHandleChange?.onMultiNetSuccess(data.netHandle);
      } else if (data.multiPathState === netHandover.MultiPathState.MULTIPATH_CREATING) {
        console.info(`多网正在创建: netId=${data.netHandle.netId}`);
      } else {
        console.info(`多网释放: netId=${data.netHandle.netId}`);
        netHandleChange?.onMultiNetRelease(data.netHandle);
      }
    });
  } catch (err) {
    const error: BusinessError = err as BusinessError;
    console.error(`on multiPathStateChange Error: ${error.code}, ${error.message}`);
  }
}
```

### 步骤4:绑定Socket到网络

**获取所有网络**:
```typescript
function getAllNetHandles(): connection.NetHandle[] | undefined {
  try {
    let netHandles = connection.getAllNetsSync();
    const usefulNetHandles: connection.NetHandle[] = [];
    for (let i = 0; i < netHandles.length; i++) {
      console.info(`网络[${i}]: netId=${netHandles[i].netId}`);
      if (netHandles[i].netId >= 100) {
        usefulNetHandles.push(netHandles[i]);
      }
    }
    return usefulNetHandles;
  } catch (err) {
    const error: BusinessError = err as BusinessError;
    console.error(`getAllNetsSync Error: ${error.code}, ${error.message}`);
    return undefined;
  }
}
```

**绑定Socket到指定网络**:
```typescript
import { socket } from '@kit.NetworkKit';

async function bindSpecifiedNet(socketInstance: socket.TCPSocket, netId: number, port: number) {
  const netHandles = getAllNetHandles();
  if (netHandles) {
    for (let i = 0; i < netHandles.length; i++) {
      if (netHandles[i].netId === netId) {
        try {
          const connectionProperties = connection.getConnectionPropertiesSync(netHandles[i]);
          if (connectionProperties && connectionProperties.linkAddresses &&
            connectionProperties.linkAddresses.length > 0) {
            let netAddress: socket.NetAddress = {
              address: connectionProperties.linkAddresses[0].address.address,
              port: port
            };
            await socketInstance.bind(netAddress);
            await netHandles[i].bindSocket(socketInstance);
            console.info(`Socket绑定成功: netId=${netId}`);
          } else {
            console.error('获取连接属性失败');
          }
        } catch (err) {
          const error: BusinessError = err as BusinessError;
          console.error(`bindSocket Error: ${error.code}, ${error.message}`);
        }
        break;
      }
    }
  } else {
    console.error('网络列表为空');
  }
}
```

### 步骤5:执行并发传输

**创建Socket并发起传输**:
```typescript
async function uploadSegment(host: string, port: number, initResult: InitiateMultipartUpload,
  fileChunk: FileUpChunk, netId: number): Promise<UploadPartResult | undefined> {
  const socketInstance: socket.TCPSocket = socket.constructTCPSocketInstance();
  await bindSpecifiedNet(socketInstance, netId, 8080);
  
  try {
    await socketInstance.connect({
      address: { address: host, port: port, family: socket.NetFamily.IPv4 },
      timeout: 60000
    });
    
    const sendData = buildUploadRequest(initResult, fileChunk);
    await socketInstance.send({ data: sendData });
    
    socketInstance.on('message', (value: socket.SocketMessageInfo) => {
      const response = parseResponse(value.message);
      if (response.success) {
        return response.result;
      }
    });
  } catch (err) {
    const error: BusinessError = err as BusinessError;
    console.error(`uploadSegment Error: ${error.code}, ${error.message}`);
  }
}
```

### 步骤6:释放资源

**释放多网和取消监听**:
```typescript
function releaseMultiPath() {
  try {
    netHandover.releaseMultiPath();
    console.info('多网释放成功');
  } catch (err) {
    const error: BusinessError = err as BusinessError;
    console.error(`releaseMultiPath Error: ${error.code}, ${error.message}`);
  }
}

function setOffMultiPathStateChange() {
  try {
    netHandover.off('multiPathStateChange');
    console.info('取消多网状态监听');
  } catch (err) {
    const error: BusinessError = err as BusinessError;
    console.error(`off multiPathStateChange Error: ${error.code}, ${error.message}`);
  }
}
```

### 步骤7:错误处理

```typescript
try {
  await requestMultiPath();
  setOnMultiPathStateChange(netHandleChange);
  await performUpload();
} catch (error) {
  const err: BusinessError = error as BusinessError;
  switch (err.code) {
    case 201:
      console.error('权限校验失败,请检查权限配置');
      break;
    case 1013620002:
      console.error('应用多网请求已达上限');
      break;
    case 1013620004:
      console.error('限额耗尽,请等待配额恢复');
      break;
    case 1013620007:
      console.error('没有合适的多网链路可用');
      break;
    default:
      console.error(`未知错误: ${err.code}, ${err.message}`);
      // 降级到单网传输
      await fallbackToSingleNet();
  }
} finally {
  releaseMultiPath();
  setOffMultiPathStateChange();
}
```

## 错误码说明

| 错误码 | 说明 | 解决方法 |
|-------|------|---------|
| 201 | 权限校验失败 | 检查ohos.permission.LINKTURBO权限配置 |
| 401 | 参数检查失败 | 检查API调用参数是否正确 |
| 801 | 设备不支持该API | 确认设备API版本>=6.0.0(20) |
| 1013600001 | 内部处理异常 | 重试或检查系统状态 |
| 1013600002 | 系统处理异常 | 检查网络服务是否正常 |
| 1013620000 | 多网功能没有使能 | 确认多网功能已启用 |
| 1013620001 | 多网已激活或正在激活 | 等待当前多网释放后重新请求 |
| 1013620002 | 多网请求已达上限 | 等待配额恢复或减少请求频次 |
| 1013620003 | 功耗限制不允许发起多网 | 降低功耗或等待功耗限制解除 |
| 1013620004 | 限额耗尽 | 等待配额恢复或使用单网传输 |
| 1013620005 | 多网请求场景冲突 | 调整业务场景设置 |
| 1013620006 | 多网发起太频繁 | 降低请求频次 |
| 1013620007 | 没有合适的多网链路 | 确认至少有2个可用网络通路 |
| 1013620008 | 流量不足 | 确认蜂窝流量充足 |
| 1013620009 | 不支持并发 | 确认设备支持WiFi+蜂窝或主卡+副卡并发 |
| 1013620100 | 多网不是当前应用拉起的 | 仅释放自己发起的多网 |
| 1013620101 | 多网不在激活态 | 确认多网已成功发起 |

## 编译和修复问题

### 依赖声明
```json
{
  "dependencies": {
    "@kit.NetworkBoostKit": "^1.0.0",
    "@kit.NetworkKit": "^1.0.0",
    "@kit.CoreFileKit": "^1.0.0"
  }
}
```

### 环境要求
- HarmonyOS API版本:>=6.0.0(20)
- DevEco Studio版本:>=5.0
- 设备类型:支持多网并发的手机/平板设备

### 常见编译问题

**问题1:权限配置错误**
```
Error: Permission ohos.permission.LINKTURBO is not granted
```
**解决方法**:在module.json5中添加权限配置,并申请受限ACL权限

**问题2:API版本不匹配**
```
Error: API 'requestMultiPath' is not supported on this device
```
**解决方法**:确认设备API版本>=6.0.0(20),在代码中添加版本检查

**问题3:导入模块失败**
```
Error: Cannot find module '@kit.NetworkBoostKit'
```
**解决方法**:检查项目依赖配置,确保已安装最新SDK

## 常见问题与解决方法

### Q1:多网请求失败,提示没有合适的多网链路可用
**原因**:当前网络条件不足,只有一个可用网络通路
**解决方法**:
- 检查WiFi和蜂窝网络是否都已连接
- 确认蜂窝流量充足
- 降级到单网传输模式

### Q2:Socket绑定网络失败
**原因**:NetHandle对象无效或网络已断开
**解决方法**:
- 在绑定前检查NetHandle.netId是否>=100
- 使用getAllNetsSync获取最新网络列表
- 添加网络断开重试机制

### Q3:多网配额耗尽
**原因**:应用多网请求次数或时长超过系统限制
**解决方法**:
- 调用getMultiPathQuotaStats查询剩余配额
- 完成传输后及时释放多网资源
- 等待配额恢复或使用单网传输

### Q4:跨线程传递NetHandle失败
**原因**:Socket和NetHandle对象不支持跨线程传递
**解决方法**:
- 在子线程中使用getAllNetsSync重新获取网络
- 通过netId标识网络,在线程间传递netId而非对象
- 使用TaskPool管理并发任务

### Q5:大文件传输中断
**原因**:网络不稳定或分片失败
**解决方法**:
- 实现分片重试机制(retryTimes字段)
- 记录已传输分片,支持断点续传
- 添加网络状态监听,异常时暂停传输

## 输出结果报告

执行完成后输出以下信息:

```json
{
  "status": "success",
  "multiPathEnabled": true,
  "netHandlesUsed": [
    {"netId": 100, "bearerType": "WiFi"},
    {"netId": 101, "bearerType": "Cellular"}
  ],
  "fileTransferred": "example.zip",
  "transferSpeed": "15.2 MB/s",
  "chunksUploaded": 10,
  "totalChunks": 10,
  "duration": "45s",
  "quotaUsed": {
    "count": 1,
    "duration": 45
  },
  "apiUsed": [
    "netBoost.setSceneDesc",
    "netHandover.getMultiPathQuotaStats",
    "netHandover.requestMultiPath",
    "netHandover.on('multiPathStateChange')",
    "connection.getAllNetsSync",
    "NetHandle.bindSocket",
    "socket.constructTCPSocketInstance",
    "netHandover.releaseMultiPath"
  ]
}
```

## 参考文档

- [多网并发网络加速开发指南](references/networkboost-netmultipath-network-turbo.md)
- [netBoost API参考](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/networkboost-netboost)
- [netHandover API参考](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/networkboost-nethandover)
- [connection API参考](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-net-connection)
- [socket API参考](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-socket)
- [多网发起和释放](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/networkboost-netmultipath-request-release)
- [开发准备](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/networkboost-preparations)
- [多网并发概述](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/networkboost-netmultipathguide)
- [Network Boost Kit指南](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/network-boost-kit-guide)

## 完整示例代码

- [大文件分片上传示例](assets/multi_network_upload.ets) - 完整的大文件分片并发上传实现
- [多文件并发下载示例](assets/multi_file_download.ets) - 多文件并发下载实现
- [文件处理工具](assets/file_chunk_util.ets) - 文件分片处理工具类
- [网络绑定工具](assets/net_bind_util.ets) - 网络绑定Socket工具类

## 测试用例

### 正向测试用例
- [大文件上传测试](tests/test_large_file_upload.ets) - 测试200MB文件分片上传
- [多文件下载测试](tests/test_multi_file_download.ets) - 测试5个文件并发下载
- [配额查询测试](tests/test_quota_query.ets) - 测试多网配额查询功能

### 边界测试用例
- [最小文件测试](tests/test_min_file.ets) - 测试1MB文件传输
- [最大分片测试](tests/test_max_chunks.ets) - 测试500分片边界
- [配额耗尽测试](tests/test_quota_exhausted.ets) - 测试配额耗尽场景

### 异常测试用例
- [权限缺失测试](tests/test_permission_denied.ets) - 测试权限缺失时的降级处理
- [网络断开测试](tests/test_network_disconnect.ets) - 测试网络断开时的异常处理
- [单网场景测试](tests/test_single_net.ets) - 测试只有一个网络时的降级方案
- [配额不足测试](tests/test_insufficient_quota.ets) - 测试配额不足时的处理

Files in this skill

  • SUB_SKILL.md17.6 KB
  • assets/multi_network_upload.ets13.7 KB
  • assets/multipart_upload_example.ets8.2 KB
  • assets/permission_config.json1.6 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…