我有一台服务器(在亚马逊上运行)和一个连接到它的客户端。建立连接后,客户端和服务器以独占方式相互通信并发送消息。
例如
1. Client -> Server
2. Client -> Server
3. Client <- Server
4. Client -> Server
5. Client <- Server
6. Client <- Server
客户端可能会失去连接,并在一段时间后重新连接并恢复消息发送。另外,消息顺序的含义是什么?#2 可以在 #1 之前到达吗?
为了在现有答案中添加一点(因为它有一个要求详细说明的赞成评论),一种解决方案可能是在每个节点上设置两个套接字。下面是一个示例,我们使用input
发送消息,同时侦听后台线程上的响应:
server.py
:
import zmq
import threading
context = zmq.Context()
send_socket = context.socket(zmq.PUSH)
send_socket.bind('tcp://*:5556')
def print_incoming_messages():
recv_socket = context.socket(zmq.PULL)
recv_socket.bind('tcp://*:5557')
while True:
msg = recv_socket.recv_string()
print(f'Message from client: {msg}')
# Print incoming messages in background
recv_thread = threading.Thread(target=print_incoming_messages)
recv_thread.start()
while True:
msg = input('Message to send: ')
send_socket.send_string(msg)
client.py
:
import zmq
import threading
context = zmq.Context()
send_socket = context.socket(zmq.PUSH)
send_socket.connect('tcp://127.0.0.1:5557')
def print_incoming_messages():
recv_socket = context.socket(zmq.PULL)
recv_socket.connect('tcp://127.0.0.1:5556')
while True:
msg = recv_socket.recv_string()
print(f'Message from server: {msg}')
recv_thread = threading.Thread(target=print_incoming_messages)
recv_thread.start()
while True:
msg = input('Message to send: ')
send_socket.send_string(msg)
,推/拉是最好的。它将允许异步消息传递,但如果端点离开一段时间,它将存储消息。
对于排序,ZeroMQ是FIFO队列的抽象,并且基于TCP构建。这将确保所有消息都按接收顺序传递到应用程序。