3

我有一个服务器(在亚马逊上运行)和一个连接到它的客户端。建立连接后,客户端和服务器以独占方式相互通信并发送消息。

例如

1. Client -> Server
2. Client -> Server
3. Client <- Server
4. Client -> Server
5. Client <- Server
6. Client <- Server

客户端可能会失去连接并在一段时间后重新连接并恢复消息发送。还有消息顺序的含义是什么?#2 可以在 #1 之前到达吗?

4

2 回答 2

2

要在现有答案中添加一些内容(因为它有一个要求详细说明的赞成评论),一种解决方案可能是在每个节点上设置两个套接字。这是一个示例,我们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)
于 2019-04-19T15:23:14.013 回答
1

在这种情况下推/拉是最好的。它将允许异步消息传递,但如果端点丢失一段时间,它将存储消息。

对于排序,ZeroMQ 是 FIFO 队列的抽象,并且建立在 TCP 之上。这将确保所有消息都按照接收顺序传递给应用程序。

于 2014-02-23T10:36:28.347 回答