如何检查在ZeroMQ中发送的数据是否成功

5

我对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会为我完成这项工作。我只需要知道数据是否被接收了。这是正确的吗?

你介意贴出整个ZMQ上下文设置等内容吗?了解您的用例非常重要。仅凭上面提供的**send_data()**函数源代码片段是不够的。谢谢。 - user3666197
完全不是这样的!请看更新。然而,以上是我为网络通信编写的唯一代码。它处于非常初步的阶段。 - ohmygoddess
1个回答

0

你应该在客户端添加另一个信令层,用于验证/确认服务器是否已经接收到数据。

你可以使用另一个REQ /REP层监听端口5558(假设如此)。

每次从服务器发送数据时,设置一个计时器,如果客户端在计时器内响应,则表示数据已正确发送,否则表示客户端不存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接