我是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将为我完成这项工作 . 我只需知道是否收到数据 . 那是对的吗?
1 回答
您应该从客户端获得另一个信令层,如果服务器已经收到数据,它将验证/确认服务器 .
你可以使用另一个 REQ / REP 层监听端口
5558
(让我们说) .每次从服务器发送数据时,您都会设置一个计时器,如果客户端在该计时器内响应,则表示数据正确发送,否则表示客户端不存在 .