ZMQ_STREAM代码示例
时间: 2023-07-03 20:21:40 浏览: 185
以下是一个简单的 ZMQ_STREAM 的 Python 代码示例:
```python
import zmq
ctx = zmq.Context()
socket = ctx.socket(zmq.STREAM)
socket.bind("tcp://*:5555")
while True:
message = socket.recv_multipart()
identity = message[0]
data = message[1:]
# 对数据进行处理
response = "处理后的数据".encode()
# 发送响应给客户端
socket.send_multipart([identity, response])
```
在这个示例中,我们使用 `zmq.STREAM` 创建了一个 ZMQ_STREAM 类型的 Socket,并将其绑定到本地地址的 5555 端口。然后,我们进入一个无限循环,等待客户端发送消息。当我们收到消息时,我们从消息中提取出客户端的身份标识和实际数据,并对数据进行处理。然后,我们将处理后的数据作为响应发送回客户端。
需要注意的是,在使用 ZMQ_STREAM 时,您需要手动处理身份标识,这是因为 ZMQ_STREAM 协议在消息的开头附加了一个身份标识。在上面的示例中,我们使用 `message[0]` 来提取身份标识,并将其与响应一起发送回客户端。
相关问题
ZMQ_STREAM c++示例
以下是一个简单的ZMQ_STREAM的C++示例,它创建了一个ZMQ_STREAM套接字和一个TCP服务器端口,并将二者连接起来:
```c++
#include <zmq.hpp>
#include <iostream>
#include <string>
int main () {
zmq::context_t context(1);
zmq::socket_t server(context, ZMQ_STREAM);
server.bind("tcp://*:5555");
while (true) {
zmq::message_t request;
server.recv(&request);
std::string identity(static_cast<char*>(request.data()), request.size());
std::cout << "Received identity: " << identity << std::endl;
zmq::message_t reply(5);
snprintf(static_cast<char*>(reply.data()), reply.size(), "%s", "world");
server.send(static_cast<const void*>(identity.c_str()), identity.size(), ZMQ_SNDMORE);
server.send(reply);
}
return 0;
}
```
这个示例创建了一个ZMQ_STREAM套接字并将其绑定到TCP端口5555上。它在一个无限循环中等待来自客户端的请求,并向客户端发送一个"world"字符串作为回复。在发送回复时,它使用了ZMQ_SNDMORE标志来指示消息后面还有另一条消息(客户端的标识符)。
ZMQ_STREAM 发送接收示例
以下是一个使用 ZMQ_STREAM 协议进行发送和接收的示例代码:
发送端:
```python
import zmq
context = zmq.Context()
socket = context.socket(zmq.STREAM)
socket.connect("tcp://localhost:5555")
identity = b"sender"
message = b"Hello ZMQ_STREAM"
socket.send(identity, zmq.SNDMORE)
socket.send(message)
```
接收端:
```python
import zmq
context = zmq.Context()
socket = context.socket(zmq.STREAM)
socket.bind("tcp://*:5555")
while True:
identity = socket.recv()
message = socket.recv()
print(f"Received message from {identity}: {message}")
```
在发送端,我们首先创建了一个 ZMQ_STREAM 类型的套接字,并使用 `connect()` 方法连接到目标主机和端口。然后,我们为发送者定义了一个 `identity`,并将其与消息一起发送到套接字。注意,在发送 `identity` 后,我们使用 `SNDMORE` 标志来指示消息仍将继续发送。
在接收端,我们创建了一个 ZMQ_STREAM 套接字,并使用 `bind()` 方法将其绑定到 `*:5555`。在一个无限循环中,我们接收来自套接字的 `identity` 和消息,并将它们打印出来。
需要注意的是,ZMQ_STREAM 协议需要发送和接收方都使用 `identity`。在发送端,`identity` 是可选的,但在接收端,它是必需的。如果发送端没有指定 `identity`,则接收端将无法确定消息来自哪个发送者。
阅读全文