客户端机器人
概念
由前面 client 范例可见,使用 C 语言搭建 VSOA 客户端时步骤繁琐,且若服务端未启动时,客户端也将因连接服务端失败而不能正常运行。
VSOA 提供了客户端机器人功能,客户端机器人可以自动连接指定的服务端并保持连接,使得开发者可以更加关注业务逻辑实现。
源码
基于客户端机器人 API 接口修改前面 client 程序得到如下源码。
#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 void on_command_echo (void *arg, struct vsoa_client *client, vsoa_header_t *vsoa_hdr, vsoa_payload_t *payload)
{printf("echo message, param:%.*s, data:%.*s\n",(int)payload->param_len, payload->param,(int)payload->data_len, (char *)payload->data);
}int main (int argc, char **argv)
{bool ret;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, "127.0.0.1:4001", MY_SERVER_PASSWD, NULL, 0, 1000, 1000, 1000);while (true) {/** 检查客户端是否正常链接到服务端*/if (vsoa_client_is_connect(client) == false) {continue;}/** 注册异步RPC请求*/vsoa_url_t url;vsoa_payload_t send;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);ret = vsoa_client_call(client, VSOA_CLIENT_RPC_METHOD_GET, &url, &send, on_command_echo, NULL, NULL);if (!ret) {fprintf(stderr, "Asynchronous RPC call error (not connected to server)!\n");}sleep(1);}
}
源码分析:
- VSOA 客户端 API 函数更详细说明可以查看博客https://blog.csdn.net/ScilogyHunter/article/details/140817028。
- 客户端机器人有一个固定框架:创建客户端机器人,由客户端机器人获取客户端对象,启动客户端机器人,等待客户端连接成功。用户客户端程序可以参考这个框架来写,只是配置参数和注册的请求依据实际需求而改动。
- 客户端机器人由一组 vsoa_client_auto_xxx 形式的函数实现。
- 调用vsoa_client_auto_create函数可以创建客户端机器人对象,输入参数和 vsoa_client_create 函数一样,创建时可以选择配置订阅函数和参数。
- 启动客户端机器人是需要指定客户端地址 IP 形式或 url 形式。设置连接超时时间和密码。同时可以设置一组想要订阅的 url 服务。
- 注册异步RPC请求的操作和之前一样,但要注意要判断在客户端连接正常时才能注册请求。
- 对比前面 client 程序源码可以发现借助客户端机器人可以大幅简化客户端操作程序。
执行程序
- 先启动服务端程序。
- 另外启动一个人 telnet 客户端,执行客户端程序。
- 查看客户端和服务端的打印信息。