文档管理中心
我的
您当前正在浏览新版开发者文档中心,目录分类和层级有所调整。点击左侧当前文档分类名称前的“☰”图标,可切换文档分类。 了解新版目录
指南与API参考指南系统网络Remote Communication Kit(远场通信服务)提升HTTP传输性能通过预建连接提升HTTP传输性能

通过预建连接提升HTTP传输性能

概述

从6.1.1(24)版本开始,新增支持预建连接功能。

发起一次HTTP/HTTPS请求一般需要先和目标服务器完成TCP握手和TLS握手(仅HTTPS)。后续请求如果能够复用已完成握手的连接,则可以直接收发数据,从而节省握手的耗时。Remote Communication Kit支持HTTP预建连接的能力。应用可以发起一次不进行数据传输的请求,使后续请求不再需要建立连接。

需要满足以下条件才能复用连接:

  • 使用同一个session
  • 访问同一个域名
  • 网络状态未改变(未发生切换网络、网络关闭等情况)

约束与限制

通过预建连接提升HTTP传输性能,支持Phone、PC/2in1、Tablet、Wearable、TV设备。

使用预建连接能力(ArkTS)

收起
自动换行
深色代码主题
复制
  1. import { rcp } from '@kit.RemoteCommunicationKit';
  2. export async function startConnectionOnlyByRequest() {
  3. const session = rcp.createSession();
  4. const request = new rcp.Request('https://example.com', 'GET');
  5. request.connectOnly = true;
  6. const response = await session.fetch(request);
  7. console.info(`Request succeeded, statusCode is ${response.statusCode}`);
  8. // 此session可用于发起后续请求
  9. }
注意

当Request的connectOnly属性被设置为true时,即使已有连接,此请求也一定会建立一条新的连接。

使用预建连接能力(C++)

收起
自动换行
深色代码主题
复制
  1. #include "RemoteCommunicationKit/rcp.h"
  2. #include <stdio.h>
  3. #include <thread>
  4. void DataRequestCallback(void *userContext, Rcp_Response *response, uint32_t errCode) {
  5. printf("DataRequest callback, errCode: %u\n", errCode);
  6. if (response != nullptr) {
  7. printf("Data request succeeded, status code: %d\n", response->statusCode);
  8. response->destroyResponse(response);
  9. }
  10. }
  11. void dataTransRequest() {
  12. uint32_t errCode = 0;
  13. // 创建session
  14. Rcp_Session *session = HMS_Rcp_CreateSession(nullptr, &errCode);
  15. printf("create session end: %d\n", errCode);
  16. const char *kHttpServerAddress = "https://example.com";
  17. Rcp_Request *dataRequest = HMS_Rcp_CreateRequest(kHttpServerAddress);
  18. dataRequest->method = RCP_METHOD_GET;
  19. // 设置本次请求仅建立连接。
  20. errCode = HMS_Rcp_SetRequestConnectOnly(dataRequest, true);
  21. Rcp_ResponseCallbackObject callback = {DataRequestCallback, nullptr};
  22. errCode = HMS_Rcp_Fetch(session, dataRequest, &callback);
  23. printf("session fetch end: %d\n", errCode);
  24. // 等待结果,仅是等待异步调用完成,开发者可根据自己实际场景处理回调。
  25. std::this_thread::sleep_for(std::chrono::milliseconds(1000 * 1000 * 3));
  26. // 请求完成后,清理request
  27. HMS_Rcp_DestroyRequest(dataRequest);
  28. // 此session在被close前可用于发起后续请求
  29. errCode = HMS_Rcp_CloseSession(&session);
  30. printf("HMS_Rcp_CloseSession end errCode: %d\n", errCode);
  31. }
注意

请求被设置为仅建立连接后,即使已有连接,此请求也一定会建立一条新的连接。

只有通过HMS_Rcp_Fetch接口发起的请求可以复用已有的连接;通过HMS_Rcp_FetchSync接口发起的请求不支持连接复用。

通过DefaultSession使用连接复用能力

不同的session之间不支持连接复用。可以通过默认session在同一个session上方便地发起请求。通过getDefaultSession(ArkTS)和HMS_Rcp_GetDefaultSession(C API)获得的默认session在系统内实际上是同一个session。

ArkTS:

收起
自动换行
深色代码主题
复制
  1. import { rcp } from '@kit.RemoteCommunicationKit';
  2. export async function startConnectionOnlyByRequest() {
  3. const defaultSession = rcp.getDefaultSession();
  4. const request = new rcp.Request('https://example.com', 'GET');
  5. request.connectOnly = true;
  6. const response = await defaultSession.fetch(request);
  7. console.info(`Request succeeded, statusCode is ${response.statusCode}`);
  8. // 可以在默认session上发起后续请求
  9. }

C++:

收起
自动换行
深色代码主题
复制
  1. #include <stdio.h>
  2. #include <thread>
  3. #include "RemoteCommunicationKit/rcp.h"
  4. Rcp_Session *defaultSession = nullptr;
  5. void DataRequestCallback(void *userContext, Rcp_Response *response, uint32_t errCode) {
  6. printf("DataRequest callback, errCode: %u\n", errCode);
  7. if (response != nullptr) {
  8. printf("Data request succeeded, status code: %d\n", response->statusCode);
  9. response->destroyResponse(response);
  10. }
  11. }
  12. void dataTransRequest() {
  13. uint32_t errCode = 0;
  14. // 获得默认session
  15. errCode = HMS_Rcp_GetDefaultSession(&defaultSession);
  16. printf("create session end: %d\n", errCode);
  17. const char *kHttpServerAddress = "https://example.com";
  18. Rcp_Request *dataRequest = HMS_Rcp_CreateRequest(kHttpServerAddress);
  19. dataRequest->method = RCP_METHOD_GET;
  20. Rcp_ResponseCallbackObject callback = {DataRequestCallback, nullptr};
  21. errCode = HMS_Rcp_Fetch(defaultSession, dataRequest, &callback);
  22. printf("defaultSession fetch end: %d\n", errCode);
  23. // 等待结果,仅是等待异步调用完成,开发者可根据自己实际场景处理回调。
  24. std::this_thread::sleep_for(std::chrono::milliseconds(1000 * 1000 * 3));
  25. // 清理request
  26. HMS_Rcp_DestroyRequest(dataRequest);
  27. // 可以在默认session上发起后续请求
  28. // 当不再需要默认session时,使用HMS_Rcp_CloseSession释放对默认session的强引用
  29. errCode = HMS_Rcp_CloseSession(&defaultSession);
  30. printf("HMS_Rcp_CloseSession end errCode: %d\n", errCode);
  31. }
注意

系统内会自动维护一个默认session。应用的默认session会持有对系统内默认session的引用。当应用所有的默认session被回收后,系统内默认session将被关闭。

当应用再次获取默认session时,系统内会创建一个新的默认session。新创建的默认session无法复用之前的连接。如果需要默认session长期保持连接,应用应长期持有至少一个默认session对象。