ZeroMQ(二):请求-响应模式,C和C++。
目录
请求响应基础
基本概念
工作流程
典型应用
请求-响应模式的特点
应用实例
优点
缺点
ZEROMQ C语言
2.1 服务器端代码(Reply Server)
2.2 客户端代码(Request Client)
3. 编译代码
4. 详细说明
ZEROMQ C++
1. 安装 ZeroMQ C++ Bindings (cppzmq)
2. 编写代码
2.1 服务器端代码(Reply Server)
2.2 客户端代码(Request Client)
3. 解释
总结
请求响应模式是通信中最简单和基础的模式,ZeroMQ同样支持这个模式。
请求响应基础
请求-响应模式是计算机科学和网络通信中一种常见的通信模式。这个模式通常涉及两个主要角色:客户端和服务器。
基本概念
-
客户端: 向服务器发送请求的实体。它可以是浏览器、应用程序或任何其他发起通信的设备或程序。
-
服务器: 接收客户端请求并返回响应的实体。它通常是一个提供服务、资源或数据的程序或设备。
工作流程
-
客户端发起请求: 客户端构造一个请求消息,通常包含请求的类型(如 GET、POST)、请求的资源(如网页、API端点)、以及可能的附加数据(如表单数据)。
-
服务器处理请求: 服务器接收到请求后,解析请求内容,根据请求的类型和资源进行处理。处理可能包括访问数据库、执行计算或调用其他服务。
-
服务器返回响应: 处理完成后,服务器生成一个响应消息,通常包含状态码(如200表示成功、404表示资源未找到)、响应的内容(如网页内容、数据结果)以及其他信息(如响应时间、服务器信息)。
-
客户端接收响应: 客户端接收到响应后,解析响应内容并根据需要展示或处理这些数据。
典型应用
-
网页浏览: 当你在浏览器中输入网址并按下回车时,浏览器(客户端)会向服务器发出一个请求,服务器会返回网页内容作为响应。
-
API调用: 在应用程序中调用API时,客户端发送请求(如获取数据、提交表单),服务器处理请求并返回结果。
请求-响应模式的特点
-
同步通信: 通常情况下,请求-响应模式是同步的,即客户端发送请求后会等待服务器响应完成后才继续执行后续操作。
-
单向通信: 这种模式是一种单向通信,客户端请求数据,服务器响应数据,但服务器不会主动向客户端发送消息(除非使用长轮询或WebSocket等技术)。
-
简单直观: 由于其简单的结构和流程,很多网络协议和应用程序设计都是基于这种模式的。
应用实例
-
HTTP/HTTPS: 用于Web浏览和API交互的协议,客户端(浏览器或应用)发送HTTP请求,服务器返回HTTP响应。
-
REST API: 基于HTTP协议的API风格,允许客户端通过标准的HTTP请求(如GET、POST、PUT、DELETE)与服务器进行交互。
优点
-
易于理解和实现: 请求-响应模式简洁明了,易于理解和实现。
-
兼容性强: 许多网络协议和技术都基于这种模式,因此具有良好的兼容性。
缺点
-
延迟问题: 在网络不稳定的情况下,请求和响应的延迟可能影响用户体验。
-
同步阻塞: 客户端通常需要等待响应完成才能继续执行,可能导致性能瓶颈。
总的来说,请求-响应模式是现代计算和通信中的基础构建块,为各种网络应用和服务提供了一个标准化的通信方式。
ZEROMQ C语言
在 C 语言中使用 ZeroMQ 实现请求-回复模式(Request-Reply Pattern)涉及创建一个请求端和一个回复端,通过 ZeroMQ 套接字进行通信。
2.1 服务器端代码(Reply Server)
下面是使用 C 语言编写的 ZeroMQ 请求-回复模式的示例代码。我们将分别实现一个服务器端(Reply Server)和一个客户端(Request Client)。
#include <zmq.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>int main() {// 初始化 ZeroMQ 上下文void *context = zmq_ctx_new();// 创建 REP (reply) 套接字void *responder = zmq_socket(context, ZMQ_REP);// 将套接字绑定到端口zmq_bind(responder, "tcp://*:5555");while (1) {// 接收请求char buffer[256];zmq_recv(responder, buffer, 255, 0);printf("Received request: %s\n", buffer);// 发送回复const char *reply = "World";zmq_send(responder, reply, strlen(reply), 0);}// 清理资源zmq_close(responder);zmq_ctx_destroy(context);return 0;
}
2.2 客户端代码(Request Client)
#include <zmq.h>
#include <stdio.h>
#include <string.h>int main() {// 初始化 ZeroMQ 上下文void *context = zmq_ctx_new();// 创建 REQ (request) 套接字void *requester = zmq_socket(context, ZMQ_REQ);// 连接到服务器zmq_connect(requester, "tcp://localhost:5555");// 发送请求const char *request = "Hello";zmq_send(requester, request, strlen(request), 0);// 接收回复char buffer[256];zmq_recv(requester, buffer, 255, 0);buffer[255] = '\0'; // 确保字符串以 null 结尾printf("Received reply: %s\n", buffer);// 清理资源zmq_close(requester);zmq_ctx_destroy(context);return 0;
}
3. 编译代码
编译上述代码时,需要链接 ZeroMQ 库。下面是使用 gcc
编译器的示例命令:
gcc -o server server.c -lzmq
gcc -o client client.c -lzmq
4. 详细说明
-
ZeroMQ Context:
zmq_ctx_new()
用于创建 ZeroMQ 上下文,管理所有的套接字和连接。每个应用程序应该有一个上下文对象。 -
Sockets: 使用
zmq_socket()
创建套接字。请求-回复模式中,客户端使用ZMQ_REQ
套接字,服务器使用ZMQ_REP
套接字。 -
Bind 和 Connect:
zmq_bind()
绑定服务器端套接字到指定的地址和端口。zmq_connect()
连接客户端套接字到服务器端的地址和端口。
-
消息传递:
- 使用
zmq_send()
发送消息。 - 使用
zmq_recv()
接收消息。
- 使用
-
资源清理:
zmq_close()
关闭套接字。zmq_ctx_destroy()
销毁上下文,释放相关资源。
ZEROMQ C++
1. 安装 ZeroMQ C++ Bindings (cppzmq)
ZeroMQ 的 C++ 绑定库 cppzmq
提供了对 ZeroMQ 的 C++ 封装。你可以通过包管理工具或者从 GitHub 下载源代码来安装它。
使用 vcpkg
vcpkg install cppzmq
从 GitHub 安装
git clone https://github.com/zeromq/cppzmq.git
2. 编写代码
下面是一个简单的示例,展示了如何在 C++ 中使用 ZeroMQ 实现请求-回复模式。我们将分别编写一个服务器(Reply Server)和一个客户端(Request Client)。
2.1 服务器端代码(Reply Server)
#include <zmq.hpp>
#include <iostream>
#include <string>int main() {// Initialize ZeroMQ contextzmq::context_t context(1);// Create a REP (reply) socketzmq::socket_t socket(context, ZMQ_REP);// Bind the socket to an endpoint (address:port)socket.bind("tcp://*:5555");while (true) {// Receive a requestzmq::message_t request;socket.recv(request);std::string request_str(static_cast<char*>(request.data()), request.size());std::cout << "Received request: " << request_str << std::endl;// Send a replystd::string reply_str = "World";zmq::message_t reply(reply_str.size());memcpy(reply.data(), reply_str.data(), reply_str.size());socket.send(reply);}return 0;
}
2.2 客户端代码(Request Client)
#include <zmq.hpp>
#include <iostream>
#include <string>int main() {// Initialize ZeroMQ contextzmq::context_t context(1);// Create a REQ (request) socketzmq::socket_t socket(context, ZMQ_REQ);// Connect to the server (address:port)socket.connect("tcp://localhost:5555");// Send a requeststd::string request_str = "Hello";zmq::message_t request(request_str.size());memcpy(request.data(), request_str.data(), request_str.size());socket.send(request);// Receive a replyzmq::message_t reply;socket.recv(reply);std::string reply_str(static_cast<char*>(reply.data()), reply.size());std::cout << "Received reply: " << reply_str << std::endl;return 0;
}
3. 解释
-
ZeroMQ Context: 这是 ZeroMQ 的基础对象,负责管理所有的套接字和连接。每个线程应该有一个唯一的上下文对象。
-
Sockets: ZeroMQ 的套接字对象用于发送和接收消息。在请求-回复模式中,客户端使用
ZMQ_REQ
套接字,服务器使用ZMQ_REP
套接字。 -
Bind 和 Connect: 服务器使用
bind
将套接字绑定到一个特定的地址和端口,客户端使用connect
连接到该地址和端口。 -
消息传递: 使用
send
和recv
方法来传递消息。消息是通过zmq::message_t
对象来表示的。
总结
使用 ZeroMQ 实现请求-响应模式可以带来显著的性能提升和灵活性。它不仅支持高性能的消息传递,还提供了丰富的特性,如自动重连、负载均衡、多语言支持等,使得它成为构建高性能、可靠的分布式系统和微服务架构的理想选择。
相关文章:
ZeroMQ(二):请求-响应模式,C和C++。
目录 请求响应基础 基本概念 工作流程 典型应用 请求-响应模式的特点 应用实例 优点 缺点 ZEROMQ C语言 2.1 服务器端代码(Reply Server) 2.2 客户端代码(Request Client) 3. 编译代码 4. 详细说明 ZEROMQ C 1. …...
【虚拟仿真】Unity3D中实现2DUI显示在3D物体旁边
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 这篇文章来实现2DUI显示在3D物体旁边,当我们需要在3D模型旁边显示2DUI的时候,比如人物的对…...
代码随想录 day 29 贪心
第八章 贪心算法 part03 134. 加油站 本题有点难度,不太好想,推荐大家熟悉一下方法二 https://programmercarl.com/0134.%E5%8A%A0%E6%B2%B9%E7%AB%99.html 135. 分发糖果 本题涉及到一个思想,就是想处理好一边再处理另一边,不…...
开源:LLMCompiler高性能工具调用框架
开源:LLMCompiler高性能工具调用框架 LLMCompilerLLMCompiler 框架图任务提取单元使用方式参考链接 LLMCompiler LLMCompiler 是一种 Agent 架构,旨在通过在DAG中快速执行任务来加快 Agent 任务的执行速度。它还通过减少对 LLM 的调用次数来节省 Tokens …...
【学习方法】高效学习因素 ① ( 开始学习 | 高效学习因素五大因素 | 高效学习公式 - 学习效果 = 时间 x 注意力 x 精力 x 目标 x 策略 )
文章目录 一、高效学习因素1、开始学习2、高效学习因素五大因素3、高效学习公式 - 学习效果 时间 x 注意力 x 精力 x 目标 x 策略 一、高效学习因素 1、开始学习 对于 学习差 , 调皮捣蛋 的学生 , 不要把 学习成绩差 的 原因 归因为 不爱学习 / 没有学习方法 , 可能是 还没有 …...
LeetCode Medium|【146. LRU 缓存】
力扣题目链接 题意:本题的题意就是希望我们设计一个满足 LRU 缓存的数据结构,LRU即最近最少使用。 需要我们实现 get 和 put 方法,即从缓存中获取值和设置缓存中值的方法。 还有一个约束条件就是缓存应当有容量限制,如果实现 put …...
(南京观海微电子)——LCD OTP(烧录)介绍
OTP OTP只是一种存储数据的器件,全写:ONETIMEPROGRAM。 OTP目的:提高产品的一致性 客户端的接口不支持和我们自己的产品IC之间通信,即不支持写初始化,所以产品的电学功能以及光学特性需要固化在IC中,所以需要我们来进行…...
[E二叉树] lc572. 另一棵树的子树(dfs+前中序判断+树哈希+树上KMP+好题)
文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接:572. 另一棵树的子树 2. 题目解析 看到这个题目就感觉不简单,因为写了写 dfs 版本的,发现好像不太会… 还是简单粗暴一点,直接搞一个 前序中序,进行判断即可。我…...
C# 设计模式之简单工厂模式
总目录 前言 本文是个人基于C#学习设计模式总结的学习笔记,希望对你有用! 1 基本介绍 简单工厂模式 定义:用于创建对象,将对象的创建与使用分离。 简单工厂模式中用于创建实例的方法是静态(static)方法,因而简单工厂…...
mac中dyld[5999]: Library not loaded: libssl.3.dylib解决方法
需要重新安装下openssl3.0版本 brew reinstall openssl3.0 安装后执行还是报错,需要找到openssl的安装路径 /opt/homebrew/Cellar/openssl3.0/3.0.14/lib/ 将libssl.3.dylib和libcrypto.3.dylib拷贝到自己的二进制文件同目录下,再执行二进制文件就可…...
python 容器
文章目录 数据容器特点比较通用序列操作示例代码1. s.index(x[, i[, j]])2. s.count(x)示例代码注意事项代码解释输出结果 数据容器的通用转换1. list()2. tuple()3. str()4. set()5. dict()6. enumerate()7. zip()8. sorted()9. reversed()10. map()11. filter()12. join()示例…...
微信小程序中Component中如何监听属性变化
1.在父组件的.json文件中引入子组件: "usingComponents": {"articleList":"../../components/articleList/articleList",}2.在父组件中给子组件绑定数据 <articleList num"{{number}}"></articleList>3.子组…...
【Python 逆向滑块】(实战五)逆向滑块,并实现用Python+Node.js 生成滑块、识别滑块、验证滑块、发送短信
逆向日期:2024.08.03 使用工具:Python,Node.js 本章知识:滑块距离识别,滑块轨迹生成,验证滑块并获取【validate】参数 文章难度:中等(没耐心的请离开) 文章全程已做去敏处…...
微服务架构设计的最佳实践
在当今快速变化的软件开发环境中,微服务架构因其灵活性、可扩展性和可维护性而逐渐成为大型分布式系统的首选架构模式。然而,成功实施微服务架构并非易事,它要求开发团队遵循一系列最佳实践来确保系统的可靠性、效率和可管理性。本文将探讨微…...
样式与特效(3)——实现一个测算页面
这次我们使用前端实现一个简单的游戏页面,理论上可以增加很多玩法,,但是这里为了加深前端的样式和JS点击事件,用该案例做练习。 首先需要掌握手机端的自适应,我们是只做手机端玩家页面 。需要允许自适应手机端页面, 用…...
芯片制造过程4光刻机
以下内容均取自哔哩哔哩up主谈三圈 链接: 芯片制造详解04:光刻技术与基本流程|国产之路不容易 1.光刻原理 通过光掩膜、光刻机、光刻胶进行光刻 光掩膜是芯片的蓝图,是一张刻有集成电路板图的玻璃遮光板光刻机就像一台纳米级的打印机&#…...
Nexus3 Repository代理pypi设置与应用
目录 1. 创建Blob库并指定路径 2. 创建pypi阿里镜像源 3. 创建pypi腾讯镜像源 4. 创建一个pypi组管理 5. 配置pip 6. 下载测试 扩展:配置好后无法下载解决思路。 Nexus 存储库中的 Blob 存储是指一种用于存储大量非结构化数据的技术。在 Nexus 存储库的上下文…...
PMP–知识卡片--燃起图
燃起图用两条曲线分别绘制随时间的推移、完成的工作量和总工作量的变化情况。它不仅能清晰地展示项目进度,还是对团队成员的一种激励形式。 使用燃起图可以更好地了解进度、范围变更和预期完成时间,它为所有相关方提供了更清晰的进度状态。 燃起图根据工…...
63 epoll服务器 (ET模式)
基于LT模式修改,并加入前面的应用层计算器,实现稍完整的服务器功能 1.修改tcp_socket.hpp,新增非阻塞读和非阻塞写接口 2.对于accept返回的new_sock加上EPOLLET这样的选项 注意:此代码暂时未考虑listen_sock ET的情况,…...
AI Agent
一,什么是AI Agent? AI Agent(人工智能代理)是一种能够自主执行任务和决策的智能系统。它通常具备感知环境、处理信息和采取行动的能力,能够模拟人类的思维和行为方式。 它可以是软件程序,也可以是嵌入式…...
select
select函数简介: select是Linux中常用的多路复用IO机制,它允许程序同时监控多个文件描述符(可以是套接字socket,也可以是普通文件)的读、写和异常事件。 #include <sys/select.h> #include <sys/time.h> …...
按照指定格式打印pprint()
【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 按照指定格式打印 pprint() [太阳]选择题 根据给定的Python代码,哪个选项是正确的? from pprint import pprint data { name: A, age: 30, hobbies:…...
Study--Oracle-07-ASM常用维护操作(五)
一、ASM创建新的磁盘组 1、查看系统中可用的磁盘 set lines 150; col name for a35; col path for a35; select group_number,path, state, name, total_mb, free_mb from v$asm_disk; 2、磁盘组操作 创建磁盘组 create DISKGROUP DATADGV2 EXTERNAL REDUNDANCY DISK /dev…...
[Git][分支管理][上]详细讲解
目录 1.理解分支2.创建分支3.切换分支4.合并分支5.删除分支 1.理解分支 感性理解:分支可以理解为平行宇宙,但是在用户需要的时候,可以将两个平行宇宙合并,此时两个平行宇宙的效果将会"叠加"理性理解:每次提…...
C语言指针(1)
目录 一、内存和地址 1、生活中的例子 2、内存的关系 二、指针变量和地址 1、&符号,%p占位符 2、一个简单的指针代码。 3、理解指针 4、解引用操作符 5、指针变量的大小。 三、指针变量类型的意义 1、指针解引用的作用 2、指针指针 3、指针-指针 4…...
C语言中的指针与数组
C语言中的指针与数组是编程中非常基础且强大的概念,它们之间有着紧密的联系和相互转换的可能性。深入理解这两个概念对于编写高效、可维护的C程序至关重要。以下将详细探讨C语言中的指针与数组,包括它们的基本概念、关系、应用以及一些高级话题。 一、指…...
CentOS7.9升级OpenSSL1.1.1w
下载 https://www.openssl.org/source/old/1.1.1/index.html 安装依赖 yum install gcc libffi-devel zlib* openssl-devel libffi-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc perl make 解压 tar -zxvf openss…...
环境搭建:如何安装和使用 MySQL Connector/J——与 MySQL Community Server 的关系
环境搭建:如何安装和使用 MySQL Connector/J—— MySQL Community Server 的关系 在 Java 项目中,与 MySQL 数据库的交互需要使用 MySQL Connector/J 驱动。本文将介绍 MySQL Connector/J 的作用、安装方法以及与 MySQL Community Server 的关系…...
SAP 财务管理系统 —— 企业财务智能化的领航者
在当今数字化时代,企业财务管理的智能化已成为推动企业持续增长的关键因素。SAP 财务管理系统通过智能化技术,帮助财务部门提高收入、控制成本并降低财务风险,释放财务数字化转型的价值。财务 ERP 作为 SAP 的核心组成部分,将帮助…...
python通过pyautogui自动给微信聊天窗口发消息
使用py脚本自动给聊天窗口发消息 1.突然的自我2.编写脚本玩一把i.先获取窗口位置ii.模拟聊天iii.疗效不错呢 1.突然的自我 突然想到pyautogui可以做那么事情, 那么是不是可以模拟聊天呢,如果结合现在的大模型chatGPT一边问然后得到结果一边自动和别人聊…...
网站建设资料总结/百度关键词价格查询软件
为了提高体验度,今天上午特意下载织梦cms 浏览了一下, 网上也看到相关文档, 但是实践中还是有问题, 自己重新写了一笔, 下面是代码和截图第一步上图表单部分表单部分js部分<div class"cbox mceneter">…...
怎么做网站流量统计分析/镇江百度推广公司
以上内容发布于中国国际人才交流基金会/PMI(项目管理协会) 个人总结的中文报名7个重点注意点: 1.PMI账号编号账号密码(PMI英文官网账号一定要学员自己测试是否能登录,因为中文审核机构是一定会登录检查的)&…...
青岛东八区创意做网站/app推广方案模板
python通过re模块实现正则表达式 因此在使用正则表达式前需要引用re模块 首先介绍几个方法: search()方法 re.search 扫描整个字符串并返回第一个成功的匹配位置,匹配成功返回一个匹配的对象,否则返回None。 函数语法: re.se…...
用nas 做网站/软文发布平台
最具用户友好性的技术创新中,大数据和云技术是最强大,最安全,可扩展且普遍可接受的技术,大数据可能是结构化,半结构化或非结构化的极其复杂和大量的数据,通过计算分析它可以从该数据中挖掘出有用的信息&…...
做网站如何容易被百度抓取/wordpress自助建站
一般来说,素材自身的 Alpha 通道定义着图层的透明度信息。单击查看器面板下方的“显示通道及色彩管理设置”按钮,可选择查看当前图层的 Alpha 通道。单击“切换透明网格”按钮,可以查看图层的透明区域。蒙版与遮罩,都是通过定义图…...
python做的网站如何部署/站长工具百度
MacDroid for mac版是一款帮助用户在mac安卓手机数据传输助手,由于 Mac OS X 本身并不支持 MTP 协议,所以通过 USB 将 Android 设备连接到 Mac 电脑上是无法识别的,更别说读取里面的文件了,需要用到MacDroid版了,帮你轻…...