我正在执行这个服务器程序,从多个客户端接收,但是在一个客户端的第一条消息之后,服务器正在接收数据,然后它不等待其他客户端请求,只显示第一个客户端数据并停止
此外,我无法成为使用相同Linux机器的其他VM的客户端。我不知道如何修改它以便让服务器从更多客户端接收。
1.我在不同的VM-s中运行相同的客户端程序并尝试将数据发送到服务器。只传递一条客户端消息,而其他客户端无法发送并等待。
由于
import zmq
import json
ports = ["192.168.1.24:10000"]
context = zmq.Context()
print("Connecting to server")
socket = context.socket(zmq.DEALER)
socket.setsockopt(zmq.LINGER, 0)
for port in ports:
socket.connect("tcp://%s" % port)
print("Successfully connected to server %s" % port)
for request in range(len(ports)):
print("Sending request ", request, "...")
socket.send_string("", zmq.SNDMORE)
socket.send_string("Sensor Data")
# use poll for timeouts:
poller = zmq.Poller()
poller.register(socket, zmq.POLLIN)
socks = dict(poller.poll(5 * 1000))
if socket in socks:
try:
socket.recv() # discard delimiter
msg_json = socket.recv() # actual message
sens = json.loads(msg_json)
response = "am: %s :: pam: %s :: dam: %s" % (sens['a'], sens['b'], sens['c'])
print("Received reply ", request, "[", response, "]")
except IOError:
print("Could not connect to machine")
else:
print("Machine did not respond")
客户端:
import zmq
import time
import json
port = "10000"
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:%s" % port)
while True:
# Wait for next request from server
message = str(socket.recv(), "utf-8")
print("Received request: ", message)
time.sleep(1)
msgDict = {
'am': "990",
'pam': "11",
'dam': "1",
}
ms = json.dumps(msgDict)
socket.send_string(ms)
答案 0 :(得分:0)
在您的活动流程中似乎没有很好的细节:
根据您的代码,客户端会生成一个 .send_string( json.dumps( msgDict ) )
但是在服务器端,您的代码会连续两个 .recv()
-s,这两个都是阻塞的。
所以会发生的事情是,在读完第一个.recv()
读取的消息后,服务器会直接进入第二个,再次阻塞.recv()
,在那里它会等待无限长时间(按照指示)在所有情况下,没有其他消息从distributed-system外部世界传递到您本地Context()
实例的手中。在任何这种情况下,.recv()
的阻塞形式根本不会返回。
如果怀疑是否有任何内容需要阅读, POLLIN
事件是条件必要条件,并使用其他测试,直到调用 { {1}} 返回 socket.getsockopt( zmq.RCVMORE )
,在所有首次收到的消息后,多部分元素(如果存在)已经耗尽。
鉴于您的客户端代码选择使用 False
-archetype,它将永远不会发送任何消息,而不会首先要求服务器执行此操作。如果您的服务器代码挂在上面解释的(概念上不明确的)阻止REQ
内,它将永远不会问另一个"另一个" .recv()
- 客户回复。