17我们一起做网站,杭州 建设网站制作,手机开发者网站,wordpress开发 书文章内容#xff1a;
学习ZMQ库中REQ\REP模式相关的内容
简介
应答模式#xff1a;REQ#xff08;客户端#xff09;和REP#xff08;服务端#xff09;
典型的一问一答协议#xff0c;即客户端需要首先发送hello#xff0c;服务器则返回word#xff0c;若客户端发…文章内容
学习ZMQ库中REQ\REP模式相关的内容
简介
应答模式REQ客户端和REP服务端
典型的一问一答协议即客户端需要首先发送hello服务器则返回word若客户端发送hello服务器没有应答后续通讯将不成立。客户端首先对服务端发送了hello那么客户端会等待服务端应答若在此期间客户端再次向服务端发送消息服务端是收不到的客户端有一个消息队列会放入消息队列只有在 客户端收到服务端的回应之后才会去依次处理消息队列里的内容。
问题
在使用网上的例子的时候出现了一种比较神奇的现象 客户端和服务器的代码运行起来后没有按照一问一答的形式运行。后来发现是没有理解“一问一答”的含义。客户端和服务器必须一来一回的进行。如果客户端或者服务器没有发送或者没有接收消息则会卡死。
运行 代码示例
server:
h文件
#pragma once
#include iostream
#include zmq.hclass Server
{
public:Server();~Server();void SendMsg();
private:void* m_context nullptr;void* m_subscriber nullptr;
};
cpp文件
#include server.h
#include stringServer::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.hint main()
{std::shared_ptrServer p_server std::make_sharedServer();if (p_server){while (1){p_server-SendMsg();}}return 0;
}client:
调用
#include Clinet.h
#include iostreamint main()
{std::shared_ptrClient p_server std::make_sharedClient();if (p_server){while (1){p_server-SendMsg();}}return 0;
}cpp文件
#include Clinet.h
#include stringClient::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;
};