当前位置: 首页 > news >正文

【从零开始一步步学习VSOA开发】创建VSOA的server端

创建VSOA的server端

创建工程

参考 hellovsoa 工程,创建 server 工程,工程源码修改如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "vsoa_platform.h"
#include "vsoa_server.h"#define MY_SERVER_ADDR                      "0.0.0.0"
#define MY_SERVER_PORT                      (4001)
#define MY_SERVER_NAME                      "{\"name\":\"echo server\"}"
#define MY_SERVER_PASSWD                    "123456"static void command_echo (void *arg, vsoa_server_t *server, vsoa_cli_id_t cid,vsoa_header_t *vsoa_hdr, vsoa_url_t *url, vsoa_payload_t *payload)
{struct sockaddr_in addr_in;socklen_t          namelen = sizeof(addr_in);vsoa_server_cli_address(server, cid, (struct sockaddr *)&addr_in, &namelen);printf("client %d addr is %s:%d\n", cid, inet_ntoa(addr_in.sin_addr), ntohs(addr_in.sin_port));printf("message, url:%.*s, param:%.*s, data:%.*s\n",(int)url->url_len, url->url,(int)payload->param_len, payload->param,(int)payload->data_len, (char *)payload->data);vsoa_server_cli_reply(server, cid, 0, vsoa_parser_get_seqno(vsoa_hdr), 0, payload);
}int main (int argc, char **argv)
{vsoa_server_t *server;/** 创建服务端*/server = vsoa_server_create(MY_SERVER_NAME);if (!server) {fprintf(stderr, "Can not create VSOA server!\n");return  (-1);}/** 设置密码,设置为NULL,表示密码为空,客户端可以不输入密码*/vsoa_server_passwd(server, MY_SERVER_PASSWD);/** 创建RPC服务*/vsoa_url_t url;url.url     = "/echo";url.url_len = strlen(url.url);vsoa_server_add_listener(server, &url, command_echo, NULL);/** 启动微服务*/struct sockaddr_in addr;bzero(&addr, sizeof(struct sockaddr_in));addr.sin_family      = AF_INET;addr.sin_port        = htons(MY_SERVER_PORT);addr.sin_addr.s_addr = inet_addr(MY_SERVER_ADDR);addr.sin_len         = sizeof(struct sockaddr_in);if (!vsoa_server_start(server, (struct sockaddr *)&addr, sizeof(struct sockaddr_in))) {vsoa_server_close(server);fprintf(stderr, "Can not start VSOA server!\n");return  (-1);}/** 进入监听事件循环*/while (1) {int     cnt;int     max_fd;fd_set  fds;struct timespec timeout = {1, 0 };FD_ZERO(&fds);max_fd = vsoa_server_fds(server, &fds);cnt = pselect(max_fd + 1, &fds, NULL, NULL, &timeout, NULL);if (cnt > 0) {vsoa_server_input_fds(server, &fds);}}return (0);
}

源码分析:

  1. VSOA 服务端 API 函数更详细说明可以查看博客https://blog.csdn.net/ScilogyHunter/article/details/140816123。
  2. server 端有一个固定框架:创建服务端,设置密码,创建RPC服务(可选),启动微服务和进入监听事件循环。所有服务端基本都按这个框架来写即可,只是配置参数和注册的服务依据实际需求而改动。
  3. 调用vsoa_server_create 函数里创建服务端对象,需要输入一个 json 字符串格式的参数,必须包含 name 字段的微服务名称。
  4. 密码必须设置,否则会认为设置了一个随机密码,影响正常通信,如果确实不想使用密码,输入参数可以设为 NULL。密码是一个没有任何安全加密的字符串,在当前版本中只是一个相对简单的安全管理。
  5. 创建RPC服务是可选项,也可以是发布订阅、数据流或数据报等,具体由业务需求决定。
  6. 启动微服务需要配置自身的 IP地址,支持 ipv4 和 ipv6,IP地址"0.0.0.0"表示任意或全部主机 IP,IP地址“127.0.0.1"表示自回环网卡 IP,只用于本机内部通信。如果开始时绑定的端口为 0,系统将自动分配一个端口。
  7. VSOA 微服务在启动成功之后,它应当始终监听所有的 VSOA 输入事件。
  8. 本示例程序中注册了一个 url 为"/echo"的 RPC 服务,当有客户端调用该服务时,会自动回调注册的command_echo 函数。该函数中限打印客户端信息和 message 信息,然后将接收的message 信息原样”反射“给客户端。
  9. VSOA payload 同时带载 param 和 data,param 推荐格式为 JSON,data 可以是普通二进制数据、字符串、json、 protobuf 等其他格式的载荷。总之不同数据类型使用不同的带载方式可以提高数据吞吐效率。

执行程序

编译、部署、并运行 server 程序,命令行会进入阻塞状态,等待客户端请求。
image.png

安装 vMessenge

VSOA Messenger(简称 vMessenger)是翼辉信息专为 VSOA 微服务开发而设计的测试仿真工具,提供 VSOA 客户端请求、环境变量、模拟服务器和 Proxy 代理管理等功能,方便开发者以更简单直观的方式进行 VSOA 客户端和服务端的开发、调试及数据模拟,从而提升产品开发效率和便利性。
在开发 VSOA 服务端时,开发者可以使用 vMessenger 创建客户端请求,向正在开发的服务端发送请求数据,以验证服务端是否可以正常响应。同样地,在开发 VSOA 客户端时,开发者可以通过 vMessenger 创建一个模拟服务器来模拟服务端接收请求,并返回相应的数据结构,以验证客户端请求信息的准确性。
下载地址:获取 vMessenger 安装包
下载完成后,双击安装包,按照提示安装即可。

使用 vMessenge 工具辅助测试

  1. 新建 vClient 集合。image.png

  2. 新建客户端请求,并配置名称。
    image.png
    image.png

  3. 配置服务端 URL 和密码。
    image.png

  4. 配置请求参数和请求数据。
    image.png
    image.png

  5. 发送请求并查看结果。
    image.png
    image.png

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python 定时清理日志(schedule)
  • 2024实验班选拔考试(热身赛)
  • Windows10上安装SQL Server 2022 Express
  • MySQL的安装数据库的简单操作
  • 力扣——11.盛最多水的容器
  • 基于STM32设计的盆栽种植自动管理系统(微信小程序)(201)
  • Milvus Cloud架构详解:构建高效、可扩展的向量数据库系统
  • 分布式时序数据库TimeLyre 9.2发布:原生多模态、高性能计算、极速时序回放分析
  • C++的STL简介(四)
  • React 常用 Hooks 和使用的易错点
  • gradio在windows上公网发布踩坑指南
  • PHP高校教材管理系统-计算机毕业设计源码29810
  • 大语言模型系列 - Transformer
  • 去中心化社交:探讨Facebook在区块链平台上的实践
  • 【Linux】【系统纪元】Linux起源与环境安装
  • #Java异常处理
  • [笔记] php常见简单功能及函数
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • ERLANG 网工修炼笔记 ---- UDP
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Python3爬取英雄联盟英雄皮肤大图
  • React-Native - 收藏集 - 掘金
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 汉诺塔算法
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 选择阿里云数据库HBase版十大理由
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • # 计算机视觉入门
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (七)Knockout 创建自定义绑定
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (算法)硬币问题
  • (转)C#调用WebService 基础
  • (转)scrum常见工具列表
  • (转载)OpenStack Hacker养成指南
  • (转载)从 Java 代码到 Java 堆
  • .CSS-hover 的解释
  • .form文件_SSM框架文件上传篇
  • .gitignore不生效的解决方案
  • .mysql secret在哪_MySQL如何使用索引
  • .NET CF命令行调试器MDbg入门(一)
  • .NET 设计模式初探
  • .NET 中创建支持集合初始化器的类型
  • .net(C#)中String.Format如何使用
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET中分布式服务
  • @ModelAttribute注解使用
  • @private @protected @public