一. ZMQ是什么?
普通的socket是端对端(1:1)的关系,ZMQ是N:M的关系,socket的连接需要显式地建立连接,销毁连接,选择协议(TCP/UDP)和
错误处理,ZQM屏蔽了这些细节,像是一个封装了的socket库,让网络编程变得更简单。ZMQ不关用于主机与主机之间的socket通信,
还可以是线程和进程之间的通信。
ZMQ提供的套接字可以在多种协议中传输消息,线程间,进程间,TCP等。可以使用套接字创建多种消息模式,如‘请求-应答模式’,‘发布-订阅模式’,‘分布式模式’等。
二. ZMQ特点
1. 组件来去自如,ZQM会负责自动重连,服务端和客户端可以随意的退出网络。tcp的话,必须现有服务端启动,在启动客户端,否则会报错。
2. ZMQ会在必要的情况下将消息放入队列中保存,一旦建立了连接就开始发送。
3. ZMQ有阈值机制,当队列满的时候,可以自动阻塞发送者,或者丢弃部分消息。
4. ZMQ可以使用不同的通信协议进行连接,TCP,进程间,线程间。
5. ZMQ提供了多种模式进行消息路由。如请求-应答模式,发布-订阅模式等,这些模式可以用来搭建网络拓扑结构。
6. ZMQ会在后台线程异步的处理I/O操作,他使用一种不会死锁的数据结构来存储消息。
三. ZMQ的三种消息模式
1. Reuqest-Reply(请求-应答模式)
(1). 使用Request-Reply模式,需要遵循一定的规律。
(2).客户端必要先发送消息,在接收消息;服务端必须先进行接收客户端发送过来的消息,在发送应答给客户端,如此循环
(3). 服务端和客户端谁先启动,效果都是一样的。
(4). 服务端在收到消息之前,会一直阻塞,等待客户端连上来。
创建一个客户端和服务端,客户端发送消息给服务端,服务端返回消息给客户端,客户端和服务器谁先启动都可以
client.py
import zmq
context=zmq.Context()
socket=context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")
#客户端必须要先发送消息,然后在接收消息if __name__ == '__main__':
print('zmq client start....')for i in range(1, 10):
socket.send_string("hello")
message=socket.recv()
print('received reply message:{}'.format(message))
server.py
import zmq
import time
context=zmq.Con