• 【从零开始一步步学习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 同步器是不允许的。
    • 建议为每一个线程创建一个同步器,线程内调用的所有同步命令都可以使用本线程的同步器。

    程序源码

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

    #include 
    #include 
    #include 
    #include 
    #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 试验,结果如下:
    服务端执行情况:
    image.png
    客户端执行情况:
    image.png

  • 相关阅读:
    电线延长寿命小妙招
    Meta AI的Nougat能够将数学表达式从PDF文件转换为机器可读文本
    Go语言Slice(切片)
    七彩云南文化旅游网站的设计
    小米蓝牙耳机怎么选?适合小米手机的蓝牙耳机推荐
    Spring之更便捷的读取和存储对象
    JavaIO流01:File类
    Linux11 --- 进程替换exec系列
    mysql 增量备份与恢复使用详解
    信钰证券:积极因素不断积累 机构看多中长期市场
  • 原文地址:https://blog.csdn.net/ScilogyHunter/article/details/140961940