我对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会为我完成这项工作。我只需要知道数据是否被接收了。这是正确的吗?
send_data()
**函数源代码片段是不够的。谢谢。 - user3666197