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

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同样支持这个模式。

请求响应基础

        请求-响应模式是计算机科学和网络通信中一种常见的通信模式。这个模式通常涉及两个主要角色:客户端和服务器。

基本概念

  1. 客户端: 向服务器发送请求的实体。它可以是浏览器、应用程序或任何其他发起通信的设备或程序。

  2. 服务器: 接收客户端请求并返回响应的实体。它通常是一个提供服务、资源或数据的程序或设备。

工作流程

  1. 客户端发起请求: 客户端构造一个请求消息,通常包含请求的类型(如 GET、POST)、请求的资源(如网页、API端点)、以及可能的附加数据(如表单数据)。

  2. 服务器处理请求: 服务器接收到请求后,解析请求内容,根据请求的类型和资源进行处理。处理可能包括访问数据库、执行计算或调用其他服务。

  3. 服务器返回响应: 处理完成后,服务器生成一个响应消息,通常包含状态码(如200表示成功、404表示资源未找到)、响应的内容(如网页内容、数据结果)以及其他信息(如响应时间、服务器信息)。

  4. 客户端接收响应: 客户端接收到响应后,解析响应内容并根据需要展示或处理这些数据。

典型应用

  • 网页浏览: 当你在浏览器中输入网址并按下回车时,浏览器(客户端)会向服务器发出一个请求,服务器会返回网页内容作为响应。

  • 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 连接到该地址和端口。

  • 消息传递: 使用 sendrecv 方法来传递消息。消息是通过 zmq::message_t 对象来表示的。

总结

        使用 ZeroMQ 实现请求-响应模式可以带来显著的性能提升和灵活性。它不仅支持高性能的消息传递,还提供了丰富的特性,如自动重连、负载均衡、多语言支持等,使得它成为构建高性能、可靠的分布式系统和微服务架构的理想选择。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 中国AI大模型场景探索及产业应用调研报告
  • 类和对象(上) - c++
  • 【React】常见的 HOC 使用案例
  • Qt Designer,仿作一个ui界面的练习(一):界面的基本布局
  • Unity四元数线性插值Lerp
  • C++篇:入门(2)
  • 重磅更新||Pyside6|Pyqt实现处理GUI界面获取的数据时进度条同步更新
  • 第一个 Flask 项目
  • 第十二节、人物下蹲
  • 生产力工具|vscode for mac安装及过程留存
  • 探索哈希表:C++中的实现与操作详解【Map、Set、数据结构】
  • 【Python学习手册(第四版)】学习笔记13.1-while、for循环
  • C++的STL简介(一)
  • R语言统计分析——描述性统计
  • YUM软件包管理工具:更改YUM源、配置本地YUM仓库
  • ES6指北【2】—— 箭头函数
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • CSS3 变换
  • css系列之关于字体的事
  • ES学习笔记(12)--Symbol
  • JS学习笔记——闭包
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • vue2.0项目引入element-ui
  • 复杂数据处理
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 模型微调
  • 深度学习中的信息论知识详解
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 微服务框架lagom
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • raise 与 raise ... from 的区别
  • 数据库巡检项
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​人工智能书单(数学基础篇)
  • # Java NIO(一)FileChannel
  • # 计算机视觉入门
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (8)STL算法之替换
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (九)One-Wire总线-DS18B20
  • (七)glDrawArry绘制
  • (算法)硬币问题
  • (转)LINQ之路
  • (转)一些感悟
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .net 使用ajax控件后如何调用前端脚本
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...