tcp服务消费者(c++)

概述

    此示例演示如何使用cpp_sdk编写tcp服务消费(invoker)程序,cpp_sdk提供简单易用的接口给客户调用,与服务端通信/响应通告等细节sdk内部都完现了,用户无需花时间在这些细节上,而是专注于自身业务逻辑。

示例源文件cpp_sdk/sample_tcp_invk.cpp
编译命令g++ -Wall -g -std=c++11 sample_tcp_invk.cpp -o sample_tcp_invk ../common/libhocomm.so libsdk_cppcloud.so 或者 make sample_tcp_invk
示例准备:先运行服务端cppcloud_serv,记下ip地址和端口。

示例代码

    如下给出的是关键语句伪代码。

#include "client_c.hpp" // sdk主头文件

int main( int argc, char* argv[] )
{
    // sdk初始化,传入自身服务名和所要连接的serv地址;
    int ret = client_c::Init("TestInvk", "localhost:4800");

    // 服务消费者初始化,传入要调用的服务名(regname)
    ret = client_c::InitInvoker(invkName);

    // 设置服务调用的一些参数(如超时时间)
    client_c::SetRequestTimeout(10, "");


    // sdk运行时以新开后台线程的方式运行
    ret = client_c::Run(true);

    string resp,req, line;
    while (getline(std::cin, line)) // 测试运行时改变配置,app能实时得知变化
    {
        if (line == "q")
        {
            kill(0, SIGTERM);
            break;
        }

        req = line; // string("{ \"cmd\": \"") + line + "\"}";
        std::thread th(thread_func, req);
        th.detach();
    }

    client_c::Destroy(); // 释放资源,和Init()对应。
    return 0;
}

// 发送消息线程
void thread_func( const string& msg )
{
    static int seqcount = 0;
    string resp;
    int seqidx = ++seqcount;

    printf("%d. tcp request msg: %s\n", seqidx, msg.c_str());
    // 发起调用
    int ret = client_c::TcpAioRequest(resp, msg, "TestPrvd");
    printf("%d. tcpAio response [%d]: %s\n", seqidx, ret, resp.c_str()); // 打印响应
}

启动运行

  • docker方式:

    docker exec -it <container> sample_tcp_invk [servip:port]
    必须已启动了CppCloudo容器,是容器id或name,最后的[servip:port]不写默认连接localhost:4800;

  • 手动方式:

    前提是c++ sdk库(libsdk_cppcloud.so libhocomm.so)已正常编译过了
    cd cpp_sdk;
    make sample_tcp_invk;
    ./sample_tcp_invk localhost:4800

演示结果

程序执行, 并输入了hello_ho invk_png

后续继续输入 invk2

要退出时输入q quit