同步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 试验,结果如下:
服务端执行情况:
客户端执行情况: