文档管理中心
我的
您当前正在浏览新版开发者文档中心,目录分类和层级有所调整。点击左侧当前文档分类名称前的“☰”图标,可切换文档分类。 了解新版目录
指南与API参考指南系统网络Remote Communication Kit(远场通信服务)URPC场景使用URPC进行远程程序调用

使用URPC进行远程程序调用

场景介绍

发送URPC请求,可以设置优先级等参数,返回来自远程服务器的URPC响应。当发起请求后,可以选择取消指定或正在进行的URPC请求。当完成请求后,需要关闭请求来释放与此URPC关联的资源。

约束与限制

  • 使用URPC进行远程程序调用能力支持Phone、2in1、Tablet、Wearable设备。并且从5.1.1(19)开始,新增支持TV设备。

  • 此功能需要配合部署远程服务器。如有需要,请通过在线提单的方式与我们联系。

使用示例

创建urpcStub

  1. 导入模块

    收起
    自动换行
    深色代码主题
    复制
    1. import { hilog } from '@kit.PerformanceAnalysisKit';
    2. import { urpc } from '@kit.RemoteCommunicationKit';
    3. import { BusinessError } from '@kit.BasicServicesKit';
    4. import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium';
  2. 定义远程调用的类,作为调用方法的入参和返回值,示例如下:

    收起
    自动换行
    深色代码主题
    复制
    1. // 定义调用方法的入参类示例
    2. export class MediaTaskRequestMessage {
    3. RequestMessage: urpc.FlowbufElement<string>;
    4. constructor() {
    5. this.RequestMessage = {type: 'STRING', value: '', name: ''};
    6. }
    7. setRequestMessage(RequestMessage: string) {
    8. this.RequestMessage.value = RequestMessage;
    9. }
    10. getRequestMessage(): string {
    11. return this.RequestMessage.value;
    12. }
    13. }
    14. // 定义用于接收调用方法返回值的类示例
    15. export class MediaTaskResponseMessage {
    16. ResponseMessage: urpc.FlowbufElement<string>;
    17. constructor() {
    18. this.ResponseMessage = {type: 'STRING', value: '', name: ''};
    19. }
    20. setResponseMessage(ResponseMessage: string) {
    21. this.ResponseMessage.value = ResponseMessage;
    22. }
    23. getResponseMessage(): string {
    24. return this.ResponseMessage.value;
    25. }
    26. }
  3. 创建Request对象和Response接收对象。

    收起
    自动换行
    深色代码主题
    复制
    1. let request = new MediaTaskRequestMessage();
    2. let response = new MediaTaskResponseMessage();
  4. 配置连接信息,创建发起URPC调用的UrpcStub。

    收起
    自动换行
    深色代码主题
    复制
    1. // 提前部署好的远程服务器的ip地址和端口号,下面IP地址仅作为示意
    2. let node: urpc.IpAndPort = {
    3. ip: '192.168.1.1',
    4. port: 8000
    5. }
    6. let connect: urpc.UrpcConnectConfiguration = {
    7. node: node,
    8. protocol: 'eat',
    9. }
    10. let config: urpc.UrpcInitConfiguration = {
    11. timeout: 3000,
    12. mode: 'client',
    13. connect: connect
    14. }
    15. const funcList:string[] = ['uploadFile'];
    16. let urpcStub = urpc.urpcStubCreate(config, funcList);

使用call收发网络请求

收起
自动换行
深色代码主题
复制
  1. urpcStub.then(async (stub: urpc.UrpcStub) =>{
  2. let upload_config: urpc.CallingOption = {
  3. priority: 0
  4. };
  5. let urpcPromise = stub.call('uploadFile', request, response, upload_config);
  6. urpcPromise.promise.then((resp: object) => {
  7. hilog.info(0x000, 'urpc', 'resp: %{public}s', resp);
  8. }).catch((err: BusinessError) => {
  9. hilog.error(0x000, 'urpc', 'the error code is %d', err.code);
  10. })
  11. }).catch((error: BusinessError) => {
  12. hilog.error(0x000, 'urpc', 'urpc call failed, error code is %d', error.code);
  13. })

(可选)使用cancel取消网络请求

当调用call发起一次urpc收发请求后,根据业务需要,不用接收响应时,可调用cancel取消指定callingId的请求;若不指定callingId,则取消UrpcStub发起的全部请求。

收起
自动换行
深色代码主题
复制
  1. urpcStub.then(async (stub: urpc.UrpcStub) =>{
  2. let upload_config: urpc.CallingOption = {
  3. priority: 0
  4. };
  5. let urpcPromise = stub.call('uploadFile', request, response, upload_config);
  6. stub.cancel(urpcPromise.callingId);
  7. }).catch((error: BusinessError) => {
  8. hilog.error(0x000, 'urpc', 'urpc cancel failed, error code is %d', error.code);
  9. })

使用destroy关闭URPC

当完成所有urpc收发网络请求后,需调用destroy释放并销毁UrpcStub相关的资源。

收起
自动换行
深色代码主题
复制
  1. urpcStub.then(async (stub: urpc.UrpcStub) =>{
  2. stub.destroy();
  3. }).catch((error: BusinessError) => {
  4. hilog.error(0x000, 'urpc', 'urpc destroy failed, error code is %d', error.code);
  5. })