zmq / 如何向不同的客户端发送响应?

zmq / How to send response to different clients?

我正在尝试在 Python 中使用 zmq 构建一个聊天机器人。 我已经将不同的客户端连接到服务器,当客户端发送消息时,消息会打印在他的终端和服务器的终端上,但不会打印在其他客户端的终端上。

我只找到了回应当前客户的方法,而不是同时回应所有人。

我所有的聊天客户端都是这样的,只是名字不同:

import zmq

context = zmq.Context()

#  Socket to talk to server
print("Connecting to chatbot...")
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")
name = "Max"

while True:

message = input("Message: ")
socket.send_pyobj({1:[name, message]})

#  Get the reply.
message2 = socket.recv_pyobj()
print("%s: %s" % (message2.get(1)[0], message2.get(1)[1]))

我的服务器是这样的:

import time
import zmq

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

while True:
#  Wait for next request from client
message = socket.recv_pyobj()
print("%s: %s" % (message.get(1)[0], message.get(1)[1]))
time.sleep(1)

#  Send reply back to client

socket.send_pyobj({1:[message.get(1)[0], message.get(1)[1]]})

有没有人知道一种方法,让每个客户端也能看到所有其他客户端的消息?

要将消息发送到您使用的每个客户端,请使用 zmq。PUB/zmq.SUB

如果您想保留请求回复模式,您需要为 pubsub 打开另一个套接字。

服务器将绑定 zmq.PUB 套接字并在其上发送消息。 客户端将连接一个 zmq.SUB 套接字然后订阅所有

socket.setsockopt(zmq.SUBSCRIBE, "")

您还可以进一步利用订阅并允许每个客户端只订阅它感兴趣的对话。