ZeroMQ 学习(一)

1.ZeroMQ介绍

是一种消息队列的多线程网络库,提供跨越多种传输协议的套接字,介于应用层和传输层之间。

2.ZeroMQ的设计架构

ZeroMQ的设计是基于异步的I/O操作,防止主线程阻塞,加快数据的传输。
在使用ZeroMQ时,你需要调用zmq_init()函数并传入适当的接口参数,这将创建对应数量的I/O线程。每个I/O线程都会有一个与之绑定的Poller,它采用经典的Reactor模式实现。Poller根据不同的操作系统平台选择合适的网络I/O模型,比如select、poll、epoll、devpoll、kequeue等。
​
主线程和I/O线程之间通过Mail Box传递消息来进行通信。当服务器开始监听或客户端发起连接时,主线程会在其内部创建zmq_connector或zmq_listener对象,并通过Mail Box的消息机制将其绑定到相应的I/O线程。I/O线程将会将这些对象添加到Poller中,以侦听读/写事件。
​
当服务器和客户端在第一次通信时,它们会创建zmq_init对象来交换身份信息,用以进行认证。认证完成后,双方会为此次连接创建一个Session,以后双方就通过该Session进行通信。每个Session都会关联到相应的读/写管道,主线程通过这些管道来读取/写入数据。
​
值得注意的是,Session并不直接与操作系统的内核交换I/O数据,而是通过插件(plugin)到Session中的引擎(Engine)来进行。这种设计使得ZeroMQ能够灵活地适应不同的网络环境和需求。

 

2.1ZeroMQ将消息通信分成4种模型

2.1.1一对一结对模型(Exclusive-Pair)介绍
在这种模型中,有且仅有两个节点进行通信,一个充当发送方,另一个充当接收方。每个节点都可以同时进行发送和接收操作,通信双方之间是一对一的关系。
一对一结对模型实例:
与创建socket套接字连接基本相同。
1.创建套接字:
通信双方都需要创建一个 ZeroMQ 套接字,用于进行消息的发送和接收。类型使用 ZMQ_PAIR。
注意:不同的模式使用不同的ZeroMQ套接字类型。
2.绑定和连接:
通信双方需要决定谁充当服务器端(绑定)和谁充当客户端(连接)。服务器端将套接字绑定到一个地址,而客户端则连接到该地址。
​
3.发送和接收消息:
一旦连接建立,通信双方可以通过套接字进行消息的发送和接收。每个节点都可以同时进行发送和接收操作,从而实现双向通信。
​
4.关闭套接字和上下文:
当通信结束时,通信双方需要关闭套接字,并销毁上下文对象,释放资源。
客户端:
#include <zmq.h>
#include <string>
#include <iostream>
​
int main() {
    // 创建上下文
    void *context = zmq_ctx_new();
​
    // 创建套接字并连接到服务器地址
    void *socket = zmq_socket(context, ZMQ_PAIR);
    zmq_connect(socket, "tcp://localhost:5555");
​
    // 接收消息
    char buffer[256];
    zmq_recv(socket, buffer, sizeof(buffer), 0);
    std::cout << "Received message: " << buffer << std::endl;
​
    // 关闭套接字和上下文
    zmq_close(socket);
    zmq_ctx_destroy(context);
​
    return 0;
}
服务器端:
#include <zmq.h>
#include <string>
#include <iostream>
​
int main() {
    // 创建上下文
    void *context = zmq_ctx_new();
​
    // 创建套接字并绑定到地址
    void *socket = zmq_socket(context, ZMQ_PAIR);
    zmq_bind(socket, "tcp://*:5555");
​
    // 发送消息
    std::string message = "Hello, client!";
    zmq_send(socket, message.data(), message.size(), 0);
​
    // 关闭套接字和上下文
    zmq_close(socket);
    zmq_ctx_destroy(context);
​
    return 0;
}

服务器端绑定到地址tcp://*:5555,然后发送一条消息给客户端;而客户端连接到服务器地址,并接收服务器发送的消息。这样就完成了一对一结对模型下的通信。

2.1.2.请求回应模型(Request-Reply)
通常用于多个客户端和服务器之间的交互
  • 28
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值