zmq收到消息时是一条消息一条消息的收还是会收到所有的消息
时间: 2023-10-10 21:15:51 浏览: 65
在 ZeroMQ 中,消息的接收方式取决于使用的 socket 类型以及是否使用了多路复用等技术。下面介绍常用的几种 socket 类型:
- `zmq.REQ` / `zmq.REP`:这两种 socket 类型是一对一的通信方式,即每次发送一条消息后必须等待对方的响应才能发送下一条消息。在这种情况下,消息的接收和发送是一一对应的,即每次只接收到一条消息。
- `zmq.PUB` / `zmq.SUB`:这两种 socket 类型是一对多的通信方式,即一个 `PUB` 类型的 socket 可以向多个 `SUB` 类型的 socket 广播消息。在这种情况下,如果 `SUB` socket 没有设置过滤条件,则会接收到所有的消息,即一次接收可能包含多条消息。
- `zmq.PUSH` / `zmq.PULL`:这两种 socket 类型是一对多的通信方式,即一个 `PUSH` 类型的 socket 可以向多个 `PULL` 类型的 socket 发送消息。在这种情况下,如果多个 `PULL` socket 同时向一个 `PUSH` socket 发送消息,则这些消息可能会被合并为一条消息进行发送,即一次接收可能包含多条消息。
综上所述,ZeroMQ 的消息接收方式取决于使用的 socket 类型以及具体的通信方式。如果需要精确控制消息的接收,可以使用多路复用等技术来实现。
相关问题
zmq C++ 例子 推送多条 多条拉取 例子 使用迭代器
以下是一个使用 zmq C++ 库实现的推送多条-多条拉取模式的例子,使用了迭代器来遍历消息:
**Pusher.cpp**
```cpp
#include <zmq.hpp>
#include <iostream>
#include <string>
#include <vector>
int main()
{
zmq::context_t context(1);
zmq::socket_t pusher(context, ZMQ_PUSH);
pusher.bind("tcp://*:5555");
std::vector<std::string> messages = {"message 1", "message 2", "message 3"};
for (auto it = messages.begin(); it != messages.end(); ++it) {
zmq::message_t message(it->size());
memcpy(message.data(), it->data(), it->size());
pusher.send(message, it == messages.end() - 1 ? 0 : ZMQ_SNDMORE);
std::cout << "Sent message: " << *it << std::endl;
sleep(1);
}
return 0;
}
```
**Puller.cpp**
```cpp
#include <zmq.hpp>
#include <iostream>
#include <string>
#include <vector>
int main()
{
zmq::context_t context(1);
zmq::socket_t puller(context, ZMQ_PULL);
puller.connect("tcp://localhost:5555");
std::vector<std::string> messages;
while (true) {
zmq::message_t message;
puller.recv(&message);
std::string msg(static_cast<char*>(message.data()), message.size());
messages.push_back(msg);
int more = 0;
size_t more_size = sizeof(more);
puller.getsockopt(ZMQ_RCVMORE, &more, &more_size);
if (!more) {
for (auto it = messages.begin(); it != messages.end(); ++it) {
std::cout << "Received message: " << *it << std::endl;
}
messages.clear();
}
}
return 0;
}
```
运行 Pusher.cpp 和 Puller.cpp,你就可以在控制台上看到推送的消息和拉取的消息了。这个例子中,Pusher 会向 Puller 推送多条消息,Puller 则会一直拉取并输出收到的所有消息。注意,在发送消息时需要使用 `ZMQ_SNDMORE` 标志来告诉 ZeroMQ 还有更多的消息要发送。在接收消息时,需要使用 `ZMQ_RCVMORE` 标志来判断是否还有更多的消息没有接收完。
zmq C++ 例子 推送多条 多条拉取 例子 使用recv_multipart
以下是一个使用 zmq C++ 库实现的推送多条-多条拉取模式的例子,使用了 `recv_multipart` 函数来接收多条消息:
**Pusher.cpp**
```cpp
#include <zmq.hpp>
#include <iostream>
#include <string>
#include <vector>
int main()
{
zmq::context_t context(1);
zmq::socket_t pusher(context, ZMQ_PUSH);
pusher.bind("tcp://*:5555");
std::vector<std::string> messages = {"message 1", "message 2", "message 3"};
for (auto it = messages.begin(); it != messages.end(); ++it) {
zmq::message_t message(it->size());
memcpy(message.data(), it->data(), it->size());
pusher.send(message, it == messages.end() - 1 ? 0 : ZMQ_SNDMORE);
std::cout << "Sent message: " << *it << std::endl;
sleep(1);
}
return 0;
}
```
**Puller.cpp**
```cpp
#include <zmq.hpp>
#include <iostream>
#include <string>
#include <vector>
int main()
{
zmq::context_t context(1);
zmq::socket_t puller(context, ZMQ_PULL);
puller.connect("tcp://localhost:5555");
while (true) {
std::vector<std::string> messages;
zmq::message_t message;
puller.recv_multipart(&messages);
for (auto it = messages.begin(); it != messages.end(); ++it) {
std::cout << "Received message: " << *it << std::endl;
}
}
return 0;
}
```
运行 Pusher.cpp 和 Puller.cpp,你就可以在控制台上看到推送的消息和拉取的消息了。这个例子中,Pusher 会向 Puller 推送多条消息,Puller 则会一直拉取并输出收到的所有消息。在接收消息时,使用 `recv_multipart` 函数可以一次性接收所有的消息。
阅读全文