ZMQ_REQ\REP模式

文章内容:

  1. 学习ZMQ库中REQ\REP模式相关的内容
简介

应答模式:REQ(客户端)和REP(服务端)

  • 典型的一问一答协议,即客户端需要首先发送hello,服务器则返回word,若客户端发送hello,服务器没有应答,后续通讯将不成立。
  • 客户端首先对服务端发送了hello,那么客户端会等待服务端应答,若在此期间客户端再次向服务端发送消息,服务端是收不到的,客户端有一个消息队列,会放入消息队列,只有在 客户端收到服务端的回应之后才会去依次处理消息队列里的内容。
问题:

在使用网上的例子的时候出现了一种比较神奇的现象:
客户端和服务器的代码运行起来后没有按照一问一答的形式运行。后来发现是没有理解“一问一答”的含义。客户端和服务器必须一来一回的进行。如果客户端或者服务器没有发送或者没有接收消息则会卡死。

运行:

在这里插入图片描述

代码示例:

server:
h文件
#pragma once
#include <iostream>
#include "zmq.h"

class Server
{
public:
	Server();
	~Server();

	void SendMsg();
private:
	void* m_context = nullptr;
	void* m_subscriber = nullptr;
};
cpp文件
#include "server.h"
#include <string>

Server::Server()
{
	m_context = zmq_ctx_new();
	m_subscriber = zmq_socket(m_context, ZMQ_REP);
    int rc = zmq_bind(m_subscriber, "tcp://127.0.0.1:8080");
    if (rc != 0)
    {
        printf("Socket binding failed\n");
        // return -1;
    }
}

Server::~Server()
{

}

void Server::SendMsg()
{
	char buffer[256];
	memset(buffer, 0, sizeof(buffer) - 1);
	zmq_recv(m_subscriber, buffer, sizeof(buffer) - 1, 0); // 接收消息
	printf("Received message: %s\n", buffer);

	zmq_sleep(1);
	strcpy_s(buffer, "World");  // 准备回复消息
	zmq_send(m_subscriber, buffer, strlen(buffer), 0);  // 发送回复消息
}

调用:
#include "server.h"

int main()
{
	std::shared_ptr<Server> p_server = std::make_shared<Server>();
	if (p_server)
	{
		while (1)
		{
			p_server->SendMsg();
		}
	}
	return 0;
}
client:
调用:
#include "Clinet.h"
#include <iostream>

int main()
{
	std::shared_ptr<Client> p_server = std::make_shared<Client>();
	if (p_server)
	{
		while (1)
		{
			p_server->SendMsg();
		}
	}
	return 0;
}

cpp文件:
#include "Clinet.h"
#include <string>

Client::Client()
{
    m_context = zmq_ctx_new();
    // 客户端
    m_subscriber = zmq_socket(m_context, ZMQ_REQ);
    // zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "", 0);
    int rc = zmq_connect(m_subscriber, "tcp://127.0.0.1:8080");  // 连接到服务器端的地址和端口
    if (rc != 0)
    {
        printf("connect error %s\n", zmq_strerror(errno));
        zmq_close(m_subscriber);
        zmq_ctx_destroy(m_context);

    }

}

Client::~Client()
{
}

void Client::SendMsg()
{
    // std::cout << "sendMsg" << std::endl;
    int rc;
    // 3.循环发送数据、接收数据
    char str_tmp[] = "Hello, ZeroMQ!";
    char* msg = str_tmp;
    rc = zmq_send(m_subscriber, msg, strlen(msg), 0);  // 发送消息
    if (rc == -1)
    {
        printf("send error: %s\n", zmq_strerror(errno));
    }

    char buffer[256];
    memset(buffer, 0, sizeof(buffer) - 1);
    zmq_recv(m_subscriber, buffer, sizeof(buffer) - 1, 0); // 接收消息
    printf("Received message: %s\n", buffer);

}

H文件:
#pragma once
#include "zmq.h"
class Client
{
public:
	Client();
	~Client();

	void SendMsg();
private:
	void* m_context = nullptr;
	void* m_subscriber = nullptr;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/319950.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习工具-如何选择服务器和GPU

深度学习训练通常需要大量的计算。目前&#xff0c;GPU是深度学习最具成本效益的硬件加速器。与CPU相比&#xff0c;GPU更便宜&#xff0c;性能更高&#xff0c;通常超过一个数量级。此外&#xff0c;一台服务器可以支持多个GPU&#xff0c;高端服务器最多支持8个GPU。更典型的…

分布式缓存

分布式缓存 缓存雪崩 缓存雪崩我们可以简单的理解为&#xff1a;由于原有缓存失效&#xff0c;新缓存未到期间所有原本应该访问缓存的请求都去查询数据库了&#xff0c;而对数据库 CPU 和内存造成巨大压力&#xff0c;严重的会造成数据库宕机。从而形成一系列连锁反应&#xf…

自动粘贴文本:高效复制中国邮政编码,提升效率,释放创意

在快节奏的现代生活中&#xff0c;时间就是金钱&#xff0c;效率就是生命。中国邮政EMS&#xff0c;作为您的快递服务首选&#xff0c;一直致力于提供更加便捷、高效的寄递体验。今天&#xff0c;我们隆重推出全新功能——"自动粘贴文本"&#xff0c;让您轻松复制邮政…

【EAI 006】ChatGPT for Robotics:将 ChatGPT 应用于机器人任务的提示词工程研究

论文标题&#xff1a;ChatGPT for Robotics: Design Principles and Model Abilities 论文作者&#xff1a;Sai Vemprala, Rogerio Bonatti, Arthur Bucker, Ashish Kapoor 作者单位&#xff1a;Scaled Foundations, Microsoft Autonomous Systems and Robotics Research 论文原…

1.3K Star,让发送短信变的更简单

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;我的公众号「GitHub指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值。 前言 在日常的开发过程中&#xff0c;短信的发送经常使用&#xff08;尤其是中小型的外…

C#,入门教程(18)——分支语句(switch-case)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(17)——条件语句&#xff08;if-else&#xff09;的基础知识https://blog.csdn.net/beijinghorn/article/details/124033376 1、switch概述 switch-case分支语句 可以理解为 大号 的 if-else。 switch语句以switch关键字开头&…

x-cmd pkg | tmux - 开源终端多路复用器(terminal multiplexer)

目录 简介首次用户基本概念功能特点竞品和相关作品进一步阅读 简介 tmux 是一个用于 Unix 操作系统的开源终端复用器&#xff08;terminal multiplexer&#xff09;&#xff0c;它允许用户在一个终端窗口中创建多个虚拟终端会话&#xff0c;并同时在这些会话之间切换&#xff…

谈⼀谈你对TCPIP四层模型,OSI七层模型的理解

TCP/IP四层模型 对比 OSI七层模型 OSI七层模型 为了增强通⽤性和兼容性&#xff0c;计算机⽹络都被设计成层次机构&#xff0c;每⼀层都遵守⼀定的规则。因此有了OSI这样⼀个抽象的⽹络通信参考模型&#xff0c;按照这个标准使计算机⽹络系统可以互相连接 物理层 通过⽹线、光…

Harbor离线安装

下载安装包 $ wget https://github.com/goharbor/harbor/releases/download/v2.7.4/harbor-offline-installer-v2.7.4.tgz解压 $ tar xvf harbor-offline-installer-v2.7.4.tgz -C /usr/local修改配置 $ cd /usr/local/harbor $ cp harbor.yml.tmpl harbor.yml $ vim harbo…

第 4 课 创建工作空间与功能包

文章目录 第 4 课 创建工作空间与功能包1.工作环境的创建2.ROS功能包的创建 第 4 课 创建工作空间与功能包 消息和服务的创建、发布器和订阅器的编写、服务端和客户端的编写都是基于Ros功能包进行操作的&#xff0c;因此在进行上述操作前&#xff0c;需要先创建工作空间及功能包…

Java期末复习题库(封装,继承,抽象类,接口,GUI)

包与字符串 1.创建包的基本操作 在biology包中的animal包中有human类,它具有name,height,weight的属性,还具有eat(),sleep()和work()的行为,在biology包中的plant包中有flower类,它具有name,color,smell的属性,还具有drink()和blossom()的行为. 现在在一个school包中的garde…

服务器经常宕机的原因及解决办法

随着如今互联网信息化时代的不断发展&#xff0c;数据存储和传输在各种网络科技面前也显得越来越重要&#xff0c;对于企业来讲&#xff0c;建站之后服务器的安全稳定是至关重要的选择。那么选择一款好用的服务器愈发重要。 当然&#xff0c;不管是多好的服务器提供商&#xff…

延时任务的解决方案

延时任务的解决方案 1.数据库轮询2. JDK的延迟队列3.netty时间轮算法4.使用消息队列 1.数据库轮询 该方案通常是在小型项目中使用&#xff0c;即通过一个线程定时的去扫描数据库&#xff0c;通过订单时间来判断是否有超时的订单&#xff0c;然后进行update或delete等操作 代码示…

leetcode206.反转链表

https://leetcode.cn/problems/reverse-linked-list/description/ 题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&am…

ruoyi后台管理系统部署-2-安装mysql

centos7 mysql 安装 1. 手动安装 安装 首先查看系统是否安装了&#xff1a; rpm -qa|grep mariadb rpm -qa | grep mysql systemctl status mysqld find / -name mysql.cnf卸载自带的 mariadb: rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps去官网下载 mysql 安装包&…

基于Springboot的网上点餐系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的网上点餐系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&am…

13、Redis高频面试题

1、项目中为什么用Redis 我们项目中之所以选择Redis&#xff0c;主要是因为Redis有下面这些优点&#xff1a; 操作速度快&#xff1a;Redis的数据都保存在内存中&#xff0c;相比于其它硬盘类的存储&#xff0c;速度要快很多数据类型丰富&#xff1a;Redis支持 string&#x…

imgaug库指南(18):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

GUI编程(函数解析以及使用)

1.介绍 AWT&#xff08;Abstract Window Toolkit&#xff09;和Swing 是 Java 提供的用于创建图形用户界面&#xff08;GUI&#xff09;的类库。 AWT&#xff1a;AWT 是 Java 最早提供的 GUI 类库&#xff0c;它基于本地平台的窗口系统&#xff0c;使用操作系统的原生组件进行…

高级分布式系统-第10讲 分布式控制系统

自动化是关于一切人造系统自动、智能、自主、高效和安全运行的科学与技术 计算机控制技术是实现自动化的主要方法和手段 分布式控制技术是伴随着机器大工业生产而诞生的特殊计算机控制技术 计算机控制系统 指利用计算机&#xff08;通常称为工业控制计算机&#xff0c;简称工…
最新文章