欢迎访问宙启技术站
智能推送

使用Python实现zmqDEALER与PAIR模式的通信

发布时间:2023-12-11 12:20:49

ZMQ(ZeroMQ)是一种高效、可扩展的消息传递库,可以在不同的进程、线程或计算机之间传递消息。其中,zmq.DEALER和zmq.PAIR是两种常用的通信模式。

DEALER模式是一种双向的多对多模式,每个DEALER都可以同时连接多个ROUTER,可以同时向多个ROUTER发送消息,并接收来自任何一个ROUTER的消息。PAIR模式是一种1对1的模式,两个PEER之间可以互相发送和接收消息。

下面是一个使用Python实现zmq的DEALER和PAIR模式的通信的例子。

首先,我们需要安装zmq库。运行以下命令:

pip install pyzmq

DEALER模式的代码如下:

import zmq

context = zmq.Context()
dealer = context.socket(zmq.DEALER)
dealer.identity = b'dealer1'
dealer.connect('tcp://localhost:5555')

dealer.send(b'Hello from dealer1')
msg = dealer.recv()
print('Received reply:', msg.decode())

在这个例子中,我们创建了一个DEALER类型的socket,并设置了它的身份标识为"dealer1"。然后,我们连接到指定的地址和端口(本例中是'localhost:5555')。接下来,我们使用send方法发送了一条消息,然后使用recv方法接收服务端的回复消息,并打印出来。

接下来,我们需要编写一个ROUTER类型的socket作为服务端来处理这个请求,并将其发送到其他CLIENT。

import zmq

context = zmq.Context()
router = context.socket(zmq.ROUTER)
router.bind('tcp://*:5555')

while True:
    msg = router.recv_multipart()
    client_id = msg[0]
    client_message = msg[2]

    print('Received request from', client_id.decode(), ':', client_message.decode())

    # Process the request
    response = b'Reply from server'
    
    # Send the reply back to the client
    router.send_multipart([client_id, b'', response])

在这个例子中,我们创建了一个ROUTER类型的socket,并绑定到一个指定的地址和端口(本例中是'*:5555',表示绑定到所有可用接口)。

然后,我们进入一个无限循环,不断接收来自DEALER的消息,并处理。我们使用recv_multipart方法接收消息,然后分别解析出客户端的ID和消息内容。我们在这里简单地回复了一条消息"Reply from server"。

接下来,我们使用send_multipart方法将回复消息发送回DEALER。需要注意的是,我们在发送时将DEALER的ID作为回复消息的 个部分,以保持双方通信的一致性。

PAIR模式的代码如下:

import zmq

def client():
    context = zmq.Context()
    pair = context.socket(zmq.PAIR)
    pair.connect('tcp://localhost:5556')

    pair.send(b'Hello from client')
    msg = pair.recv()
    print('Received reply:', msg.decode())

def server():
    context = zmq.Context()
    pair = context.socket(zmq.PAIR)
    pair.bind('tcp://*:5556')

    msg = pair.recv()
    print('Received request:', msg.decode())

    # Process the request
    response = b'Reply from server'

    # Send the reply back to the client
    pair.send(response)

client()
server()

在这个例子中,我们使用两个函数分别表示客户端和服务端。首先,我们创建一个PAIR类型的socket,并将其连接到指定的地址和端口(客户端)或绑定到指定的地址和端口(服务端)。

在客户端函数中,我们使用send方法发送一条消息,然后使用recv方法接收服务端的回复消息,并打印出来。

在服务端函数中,我们首先使用recv方法接收来自客户端的消息,然后打印出来。接下来,我们简单地回复了一条消息"Reply from server",并使用send方法将其发送给客户端。

最后,我们分别调用客户端和服务端函数来进行通信。

这就是使用Python实现zmq的DEALER和PAIR模式的通信的例子。使用这些模式,我们可以实现灵活且高效的进程间或线程间通信。