ZMQ请求应答模型

2024-08-23 08:44
文章标签 模型 请求 应答 zmq

本文主要是介绍ZMQ请求应答模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

案例一

这个案例的出处是ZMQ的官网。请求段发送Hello,应答端回复World。
ZMQ

Request(client)

#include <string>
#include <iostream>
#include <zmq.hpp>using namespace std;
using namespace zmq; // 使用 zmq 命名空间int main()
{// initialize the zmq context with a single IO threadcontext_t context{1};// construct a REQ (request) socket and connect to interfacesocket_t socket{context, socket_type::req};socket.connect("tcp://localhost:5555");// set up some static data to sendconst string data{"Hello"};for (auto request_num = 0; request_num < 10; ++request_num) {// send the request messagecout << "Sending Hello " << request_num << "..." << endl;socket.send(buffer(data), send_flags::none);// wait for reply from servermessage_t reply{};socket.recv(reply, recv_flags::none);cout << "Received " << reply.to_string(); cout << " (" << request_num << ")";cout << endl;}return 0;
}

Reply(server)

#include <string>
#include <chrono>
#include <thread>
#include <iostream>#include <zmq.hpp>int main() 
{using namespace std::chrono_literals;// initialize the zmq context with a single IO threadzmq::context_t context{1};// construct a REP (reply) socket and bind to interfacezmq::socket_t socket{context, zmq::socket_type::rep};socket.bind("tcp://*:5555");// prepare some static data for responsesconst std::string data{"World"};for (;;) {zmq::message_t request;// receive a request from clientsocket.recv(request, zmq::recv_flags::none);std::cout << "Received " << request.to_string() << std::endl;// simulate workstd::this_thread::sleep_for(1s);// send the reply to the clientsocket.send(zmq::buffer(data), zmq::send_flags::none);}return 0;
}

编译

g++ -o server server.cpp `pkg-config --cflags --libs libzmq`
g++ -o client client.cpp `pkg-config --cflags --libs libzmq`

在这里插入图片描述

请求应答步骤

请求端

建立与应答端的连接

第一步:创建ZMQ上下文
context_t context{1};

创建一个 ZeroMQ 上下文(context),并初始化为只有一个 I/O 线程。context_t 是 ZeroMQ 库中用于管理套接字的类。

第二步:创建一个请求套接字
socket_t socket{context, socket_type::req}

在上下文中创建一个套接字(socket),并指定其类型为 req(请求者)。这意味着这个套接字将发送请求并等待响应。

第三步:连接端点
socket.connect("tcp://localhost:5555")

将套接字连接到本地主机上的 5555 端口。这是服务器监听的端口。

发送消息请求

发送消息不是固定的,可以用静态字符串发送,也可以输入信息发送,但用socket发送消息的函数是不变的。

socket.send()

用于发送消息

socket.send(buffer(data), send_flags::none);
函数参数
buffer(data)

这是一个 zmq::buffer 对象,它是一个辅助类,用于创建一个消息缓冲区。在这里,它接收一个 std::string 类型的参数 data,并将这个字符串的内容作为消息发送。buffer 类型的对象通常用于封装消息数据,以便与 ZeroMQ 的套接字接口一起使用。

send_flags

这是一个枚举值,用于指定发送消息时的选项。send_flags::none 表示没有特殊的发送标志,即消息将按照默认的方式发送。ZeroMQ 还提供了其他发送标志,例如:

send_flags::dontwait:非阻塞发送,如果无法立即发送消息,函数会立即返回,而不是等待。
send_flags::sndmore:表示消息分多部分发送,这个标志用于告诉 ZeroMQ 还有更多的消息部分即将发送。

函数返回值

在 ZeroMQ 的 C++ 绑定中,socket.send() 函数的返回值是一个整数,表示发送的字节数。这个返回值通常用于确认消息是否成功发送,以及发送了多少数据。
如果发送成功,函数返回发送的字节数。如果发送失败,函数返回 -1,并设置相应的错误代码,可以通过 errno 来获取。

接收应答端的回复

message_t

这个message_t也是ZMQ库中的类,reply也就是类的对象

message_t reply{};

创建一个 message_t 类型的变量 reply,用于接收服务器的响应。

socket.recv();
socket.recv(reply, recv_flags::none);

从服务器接收响应消息,并将消息内容存储在 reply 变量中。

函数参数
reply

这是一个 zmq::message_t 类型的对象,它用于存储从套接字接收到的消息。zmq::message_t 是 ZeroMQ 库中用于表示消息的类。当 recv 函数成功执行后,reply 对象将包含接收到的消息数据。

recv_flags::none:

这是一个枚举值,用于指定接收消息时的选项。recv_flags::none 表示没有特殊的接收标志,即消息将按照默认的方式接收。ZeroMQ 还提供了其他接收标志,例如:

recv_flags::dontwait:非阻塞接收,如果当前没有消息可接收,函数会立即返回,而不是等待。
recv_flags::recvmore:告诉 ZeroMQ 预期更多的消息部分将会到来。这通常用于多部分消息的接收。

函数返回值

在 ZeroMQ 的 C++ 绑定中,socket.recv() 函数的返回值是一个布尔值,表示是否成功接收到了消息。这个返回值用于判断接收操作是否成功完成。

如果返回 true,表示成功接收到了消息,并且 zmq::message_t 对象(如示例中的 reply)中包含了接收到的消息数据。
如果返回 false,表示接收操作失败。失败的原因可能是因为套接字被关闭、发生了错误,或者(如果使用了非阻塞标志)没有消息可接收。

应答端

建立与端点的连接

第一步:创建ZMQ上下文
context_t context{1};

创建一个 ZeroMQ 上下文(context),并初始化为只有一个 I/O 线程。context_t 是 ZeroMQ 库中用于管理套接字的类。

第二步:创建一个请求套接字
socket_t socket{context, socket_type::rep};

在上下文中创建一个套接字(socket),并指定其类型为 rep(应答者)。这意味着这个套接字将等待请求消息并响应回复。

第三步:连接端点
socket.bind("tcp://*:5555");

将套接字连接到本地主机上的 5555 端口。这是服务器的端口。

接收请求端的请求消息

message_t

这个message_t也是ZMQ库中的类,reply也就是类的对象

message_t request;

创建一个 message_t 类型的变量 request,用于接收请求端的消息。

socket.recv();
socket.recv(request, recv_flags::none);

从服务器接收响应消息,并将消息内容存储在 request变量中。

处理请求消息,应答请求

socket.send()

用于发送消息

socket.send(buffer(data), send_flags::none);

这篇关于ZMQ请求应答模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1098904

相关文章

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

springboot filter实现请求响应全链路拦截

《springbootfilter实现请求响应全链路拦截》这篇文章主要为大家详细介绍了SpringBoot如何结合Filter同时拦截请求和响应,从而实现​​日志采集自动化,感兴趣的小伙伴可以跟随小... 目录一、为什么你需要这个过滤器?​​​二、核心实现:一个Filter搞定双向数据流​​​​三、完整代码

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

AJAX请求上传下载进度监控实现方式

《AJAX请求上传下载进度监控实现方式》在日常Web开发中,AJAX(AsynchronousJavaScriptandXML)被广泛用于异步请求数据,而无需刷新整个页面,:本文主要介绍AJAX请... 目录1. 前言2. 基于XMLHttpRequest的进度监控2.1 基础版文件上传监控2.2 增强版多

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对