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

ZeroMQ 代理架构实现(Python 服务端 + C++ 代理 + C++ 客户端)

需求

使用zmq,服务端用python 开发,服务和客户端不能直接通信,需要中转或代理,客户端和代理用c++开发,请给出三处的程序

ZeroMQ 代理架构实现(Python 服务端 + C++ 代理 + C++ 客户端)

下面实现一个完整的 ZeroMQ 架构,其中:

  • 服务端用 Python 开发(REP 模式)
  • 代理用 C++ 开发(ROUTER-DEALER 模式)
  • 客户端用 C++ 开发(REQ 模式)

架构说明

Client (REQ) → Proxy (ROUTER-DEALER) → Server (REP)

1. Python 服务端 (server.py)

import zmq
import timecontext = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")print("Server started, waiting for requests...")while True:# 接收来自代理的请求message = socket.recv_string()print(f"Received request: {message}")# 模拟处理时间time.sleep(1)# 发送回复reply = f"Processed: {message}"socket.send_string(reply)

2. C++ 代理 (proxy.cpp)

#include <zmq.hpp>
#include <iostream>
#include <string>int main() {zmq::context_t context(1);// 前端socket (ROUTER) - 接收客户端请求zmq::socket_t frontend(context, ZMQ_ROUTER);frontend.bind("tcp://*:5556");// 后端socket (DEALER) - 转发到服务端zmq::socket_t backend(context, ZMQ_DEALER);backend.connect("tcp://localhost:5555");std::cout << "Proxy started, forwarding messages between clients and server..." << std::endl;// 使用zmq_proxy进行消息转发try {zmq::proxy(frontend, backend, nullptr);} catch (const zmq::error_t& e) {std::cerr << "Proxy error: " << e.what() << std::endl;}return 0;
}

3. C++ 客户端 (client.cpp)

#include <zmq.hpp>
#include <iostream>
#include <string>
#include <thread>int main() {zmq::context_t context(1);zmq::socket_t socket(context, ZMQ_REQ);socket.connect("tcp://localhost:5556");  // 连接到代理for (int i = 0; i < 5; ++i) {std::string message = "Hello " + std::to_string(i);// 发送请求zmq::message_t request(message.begin(), message.end());socket.send(request, zmq::send_flags::none);std::cout << "Sent: " << message << std::endl;// 接收回复zmq::message_t reply;socket.recv(reply);std::cout << "Received: " << reply.to_string() << std::endl;std::this_thread::sleep_for(std::chrono::seconds(1));}return 0;
}

编译和运行步骤

1. 安装依赖

确保已安装:

  • Python 的 pyzmq: pip install pyzmq
  • C++ 的 libzmq 和 cppzmq (如前面的安装指南)

2. 编译 C++ 程序

g++ -std=c++11 proxy.cpp -o proxy -lzmq
g++ -std=c++11 client.cpp -o client -lzmq

3. 运行程序(按顺序)

  1. 先启动 Python 服务端:
python server.py
  1. 然后启动 C++ 代理:
./proxy
  1. 最后运行 C++ 客户端:
./client

程序说明

  1. 消息流:

    • 客户端发送 REQ 到代理 (5556 端口)
    • 代理通过 ROUTER-DEALER 转发到服务端 (5555 端口)
    • 服务端处理并回复,消息沿原路返回
  2. 代理功能:

    • 使用 ZMQ_ROUTER 接收客户端请求(保留客户端身份)
    • 使用 ZMQ_DEALER 转发到服务端(隐藏客户端身份)
    • zmq::proxy() 自动处理消息路由
  3. 扩展性:

    • 可以轻松扩展为多客户端、多服务端架构
    • 代理可以添加消息过滤、负载均衡等功能

预期输出

服务端输出

Server started, waiting for requests...
Received request: Hello 0
Received request: Hello 1
Received request: Hello 2
...

代理输出

Proxy started, forwarding messages between clients and server...

客户端输出

Sent: Hello 0
Received: Processed: Hello 0
Sent: Hello 1
Received: Processed: Hello 1
...

这种架构实现了客户端和服务端的解耦,代理可以添加额外的功能如负载均衡、协议转换等,而不需要修改客户端或服务端代码。

http://www.dtcms.com/a/271670.html

相关文章:

  • RabbitMQ 4.1.1-Local random exchange体验
  • 解决Ollama下载太慢问题
  • Claude Code 环境搭建教程
  • Java SE--继承
  • Python 机器学习核心入门与实战进阶 Day 7 - 复盘 + 综合实战挑战
  • NW658NW659美光固态闪存NW660NW708
  • 陶哲轩:数学界的莫扎特与跨界探索者
  • 离线二维码生成器,无需网络快速制作
  • 神经网络基础及API使用详解
  • 【项目经理】经典面试题0002:项目经理和交付经理的区别?
  • 变频器实习DAY3
  • S7-1500——(一)西门子PLC编程从入门到精通3、基于TIA 博途结构化控制语言——SCL(一)
  • 全连接神经网络(MLP)原理与PyTorch实现详解
  • 【freertos-kernel】MemMang
  • Deepseek搭建智能体个人知识库
  • LeetCode经典题解:1、两数之和(Two Sum)
  • Python Day8
  • 第九篇:信息化知识 --系统集成项目管理工程师 第3版专题知识点笔记
  • MySQL--函数
  • [Python 基础课程]关键字
  • 1068.产品销售分析Ⅰ
  • S7-1500——(一)从入门到精通1、基于TIA 博途解析PLC程序结构(三)
  • 2025年ATL宁德新能源Verify测评演绎推理数字计算SHL测评题库高分攻略分享
  • 10.9 大模型训练数据优化实战:3步让准确率从68%飙升至79%
  • Redis-哨兵机制doctor环境搭建
  • 虚拟机安装与使用vim编辑器简单使用
  • # 手机连接Wifi热点时如何设置手机的MAC地址绑定固定的静态IP地址?
  • 客户端与服务端数据加密方案及实现
  • TCP的可靠传输机制
  • Linux系统-----nfs存储,共享配置文件