我是zmq和网络编程的新手。我想使用pyzmq库编写一个简单的函数来在客户端和服务器之间发送/接收数据(使用REQ / REP模式)。我发送数据的方法如下:
def send_data(socket, data):
try:
socket.send(data)
except:
return False
return True
如果数据成功发送到服务器,该函数将返回True,如果未发送到服务器,该函数将返回False。我知道上面的代码太天真了。
我不知道如何在无法将数据发送到服务器时测试案例。我能想到的一种方法是设置发送数据的超时,并将数据发送到错误的端口。更具体地说,我将客户端套接字绑定到端口“5555”,并将服务器套接字绑定到端口“5556”。如果我发送数据,上面的函数仍将返回True,客户端程序将永远停留在那里,因为该端口上没有服务器。如何设置超时并捕获错误?因此,如果在给定时间内服务器没有响应,则上面的函数将返回False,因此如果函数返回False,我可以做其他事情。
更新(我的其余代码):
def createsocket(port, flag,ipaddr="127.0.0.1"):
# setup socket and port/address binding
context = zmq.Context()
if flag == 0: # server socket
socket = context.socket(zmq.REP)
socket.bind("tcp://*:%s" %port)
else: # client socket
socket = context.socket(zmq.REQ)
socket.connect("tcp://%s:%s" %(ipaddr,port))
return (socket,port,context)
def recv_response(socket):
message = socket.recv()
return message
我的目的是客户端向服务器发送信号字符串“init”以请求数据。然后服务器将对应,并将一些数据发送回客户端。服务器总是在听。但是,只要客户端在服务器的列表机器中,服务器也可能在没有客户端请求的情况下将数据发送到客户端。也许有比REQ / REP更好的模式,我打算首先尝试这种模式作为练习。
我想确保正确发送数据。但是当我读到zmq网站时。它说zmq可以确保接收整个消息或根本不接收消息。我的理解是我不需要担心检查接收数据的长度或使用校验和来确保正确接收数据,因为zmq将为我完成这项工作。我只需知道是否收到数据。这是对的吗?
答案 0 :(得分:0)
您应该从客户端获得另一个信令层,如果服务器已经收到数据,它将验证/确认服务器。
您可以在端口REQ
上使用其他 REP
/ 5558
层进行监听(让我们说)。
每次从服务器发送数据时,您都会设置一个计时器,如果客户端在该计时器内响应,则表示数据正确发送,否则表示客户端不存在。