【问题标题】:how to check send data in zeromq is successful or not如何检查 zeromq 中的发送数据是否成功
【发布时间】:2015-02-05 01:38:00
【问题描述】:

我是 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() 函数源代码 sn-p 根本不足以满足您上面的要求。谢谢
  • 一点也不!请查看更新。但是,上面是我为网络通信编写的唯一代码。它还处于起步阶段。

标签: zeromq pyzmq


【解决方案1】:

您应该有另一个来自客户端的信号层,它将验证/确认服务器是否已收到数据。

您可以使用另一个 REQ /REP 层在端口 5558 上侦听(比方说)。

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

【讨论】:

    猜你喜欢
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2017-07-09
    相关资源
    最近更新 更多