【从零开始一步步学习VSOA开发】同步RPC客户端

同步RPC客户端

概念

前面的测试例程都是以异步 RPC 的模式运行的,客户端调用 RPC 请求后无需等待服务端应答即可返回,后面通过回回调方式获取返回结果。

同步 RPC 即客户端在发送完毕请求后,函数进入阻塞模式一直等待,直到接受到服务端应答才唤醒并退出该函数,然后通过另外接口获取执行结果。

同步 RPC 前首先需要使用 vsoa_client_sync_create 创建 RPC 同步器,其次使用 vsoa_client_sync_call 进行同步的 RPC 调用,调用结束后,再用vsoa_parser_get_payload 获取服务端返回结果,最后用 vsoa_client_sync_delete 删除 RPC 同步器。
说明:

  • 一个 RPC 同步器在同一时刻只能执行一个 RPC 同步调用。
  • 多线程同时使用同一个 RPC 同步器是不允许的。
  • 建议为每一个线程创建一个同步器,线程内调用的所有同步命令都可以使用本线程的同步器。

程序源码

基于源客户端程序修改如下:

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/select.h>
#include "vsoa_client.h"
#include "vsoa_cliauto.h"

#define MY_SERVER_PASSWD                    "123456"

static  int  sync_rpc(vsoa_client_t *client)
{
    vsoa_client_sync_call_t *sync = NULL;

    vsoa_url_t url;
    vsoa_payload_t send;
    bool ret;
    vsoa_header_t *vsoa_hdr;
    vsoa_payload_t payload;

    url.url     = "/echo";
    url.url_len = strlen(url.url);
    send.data = "1234567";
    send.data_len = strlen(send.data);
    send.param = "abcdefg";
    send.param_len = strlen(send.param);

    sync = vsoa_client_sync_create(true);
    ret = vsoa_client_sync_call(client, VSOA_CLIENT_RPC_METHOD_GET, &url, &send, sync, &vsoa_hdr, NULL);
    if (ret) {
       if (vsoa_hdr) {
           vsoa_parser_get_payload(vsoa_hdr, &payload);
           printf("echo message, param:%.*s, data:%.*s\n",
                  (int)payload.param_len, payload.param,
                  (int)payload.data_len, (char *)payload.data);
       }
    }

    vsoa_client_sync_delete(sync);

    return  (0);
}

int main (int argc, char **argv)
{
    vsoa_client_t *client;
    vsoa_client_auto_t *cliauto;

    /*
     * 创建客户端机器人
     */
    cliauto = vsoa_client_auto_create(NULL, NULL);
    /*
     * 由客户端机器人获取客户端对象
     */
    client  = vsoa_client_auto_handle(cliauto);

    /*
     * 启动客户端机器人
     */
    vsoa_client_auto_start(cliauto, "vsoa://echo_server", MY_SERVER_PASSWD, NULL, 0, 1000, 1000, 1000);

    while (true) {
        /*
         * 检查客户端是否正常链接到服务端
         */
        if (vsoa_client_is_connect(client) == false) {
            continue;
        }
        /*
         * 注册同步RPC请求
         */
        sync_rpc(client);

        sleep(1);
    }
}

执行结果

使用同步 RPC 客户端程序替换原程序重复进行 echo 试验,结果如下:

服务端执行情况:

客户端执行情况:

相关推荐
7yewh23 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
biter008839 分钟前
opencv(15) OpenCV背景减除器(Background Subtractors)学习
人工智能·opencv·学习
Code哈哈笑2 小时前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
QQ同步助手3 小时前
如何正确使用人工智能:开启智慧学习与创新之旅
人工智能·学习·百度
流浪的小新3 小时前
【AI】人工智能、LLM学习资源汇总
人工智能·学习
A懿轩A4 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
南宫生11 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
sanguine__12 小时前
Web APIs学习 (操作DOM BOM)
学习
mahuifa12 小时前
混合开发环境---使用编程AI辅助开发Qt
人工智能·vscode·qt·qtcreator·编程ai
冷眼看人间恩怨12 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget