通过配置Configuration优化传输性能
约束与限制
通过配置Configuration优化传输性能能力支持Phone、2in1、Tablet、Wearable设备。并且从5.1.1(19)开始,新增支持TV设备。
导入模块
import { rcp } from '@kit.RemoteCommunicationKit';
import { BusinessError } from '@kit.BasicServicesKit';
请求预处理阶段
-
基于Session抽象的高并发网络框架
-
支持创建多个Session
-
支持请求动态取消
-
支持关闭Session
-
Session中的资源互相独立、互不影响
-
应用可以通过使用Session来获取最佳的网络性能体验
const session1 = rcp.createSession({requestConfiguration: {transfer: {timeout: {connectMs: 5000,transferMs: 5000}}}});const request1 = new rcp.Request('https://example.com');const request2 = new rcp.Request('https://example.com');session1.fetch(request1).then((response) => {console.info(`Request1 succeeded, message is ${JSON.stringify(response)}`);}).catch((err: BusinessError) => {console.error(`err1: error code is ${err.code}, error data is ${err.data}`);});session1.fetch(request2).then((response) => {console.info(`Request2 succeeded, message is ${JSON.stringify(response)}`);session1.close();}).catch((err: BusinessError) => {console.error(`err2: error code is ${err.code}, error data is ${err.data}`);session1.close();});session1.cancel(request1); // 取消request1请求
DNS阶段
应用可定制DNS请求规则,如定制DNS服务器、重写DNS解析函数,从而获取最佳的DNS性能体验。
// 定制DNS解析函数
const session = rcp.createSession();
const request = new rcp.Request('https://example.com');
request.configuration = {
dns: {
dnsRules: (host: string, port: number): rcp.IpAddress[] => {
if (host === 'example.com') {
return ['7.128.8.45', '7.128.8.46'];
}
return [];
}
}
};
session.fetch(request).then((response) => {
console.info(`Request succeeded, message is ${JSON.stringify(response)}`);
}).catch((err: BusinessError) => {
console.error(`err: error code is ${err.code}, error data is ${err.data}`);
});
// 定制DNS服务器
const session = rcp.createSession();
const request = new rcp.Request('https://example.com');
request.configuration = {
dns: {
dnsRules: [
{
ip: '7.128.8.45',
port: 53,
},
]
}
};
session.fetch(request).then((response) => {
console.info(`Request succeeded, message is ${JSON.stringify(response)}`);
}).catch((err: BusinessError) => {
console.error(`err: error code is ${err.code}, error data is ${err.data}`);
});
连接阶段
根据资源特征动态调整连接池大小
const session = rcp.createSession({
connectionConfiguration: {
maxConnectionsPerHost: 16,
maxTotalConnections: 1024,
}
});
for (let i = 0; i < 1024; ++i) {
session.get('https://example' + i.toString() + '.com/image.png').then((response) => {
console.info(`Request succeeded, message is ${JSON.stringify(response)}`);
}).catch((err: BusinessError) => {
console.error(`err: error code is ${err.code}, error data is ${err.data}`);
});
}
HTTP请求阶段
-
支持响应体分段返回,以节省内存
-
支持直接将响应写入文件,以节省内存
-
支持请求体分段上传,以节省内存
// 使用响应体直接写入文件const session = rcp.createSession();try {const response = await session.get('https://example.com/video.mp4', {kind: 'file',file: './video.mp4',});console.info(`Request succeeded, message is ${JSON.stringify(response)}`);} catch (err) {console.error(`err: error code is ${err.code}, error data is ${err.data}`);} finally {session.close();}// 分段上传数据const session = rcp.createSession();try {const response = await session.post('https://example.com/video.mp4', (maxSize: number) => {return new ArrayBuffer(maxSize);});console.info(`Request succeeded, message is ${JSON.stringify(response)}`);} catch (err) {console.error(`err: error code is ${err.code}, error data is ${err.data}`);} finally {session.close();}
HTTP响应阶段
获取响应各阶段耗时动态判断网络质量,动态调整请求(请求不同质量的资源、降低资源缓存数量)。更详细的示例请移步HTTP请求过程中各时间点详解。
// 获取各个阶段的耗时信息
const session = rcp.createSession();
try {
const response = await session.get('https://example.com');
console.info(response.timeInfo?.nameLookupTimeMs.toString());
console.info(response.timeInfo?.connectTimeMs.toString());
console.info(response.timeInfo?.tlsHandshakeTimeMs.toString());
console.info(response.timeInfo?.preTransferTimeMs.toString());
console.info(response.timeInfo?.startTransferTimeMs.toString());
console.info(response.timeInfo?.totalTimeMs.toString());
console.info(response.timeInfo?.redirectTimeMs.toString());
} catch (err) {
console.error(`err: error code is ${err.code}, error data is ${err.data}`);
} finally {
session.close();
}