2014-12-07 62 views
2

我是zmq和网络编程的新手。我想用pyzmq库编写一个简单的函数来发送/接收客户端和服务器之间的数据(使用REQ/REP模式)。我所做的发送数据为以下几点:如何检查zeromq中的发送数据是否成功

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 

我的目的是在客户端发送的信号串“初始化”向服务器请求数据。然后服务器将对应,并将一些数据发送回客户端。服务器始终在监听。但是,只要客户端在服务器的列表机器中,服务器也可以在没有客户端请求的情况下向客户端发送数据。也许有比REQ/REP更好的模式,我打算先尝试这种模式作为练习。

我想确保数据正确发送。但是当我阅读zmq网站时。它表示,zmq可以确保收到整条邮件或根本没有收到邮件。我的理解是我不必担心检查接收数据的长度或使用校验和来确保数据被正确接收,因为zmq将为我完成这项工作。我只需要知道数据是否被接收。那是对的吗?

+0

你介意发布整个ZMQ上下文设置等吗?获得用例的答案非常重要。 **'send_data()'**函数的源代码片段根本不足以满足您在上面提出的要求。谢谢 – user3666197 2014-12-07 12:04:09

+0

一点都不!请参阅更新。但是,以上是我为网络通信编写的唯一代码。它正处于开始阶段。 – ohmygoddess 2014-12-07 16:05:57

回答

0

你应该有另一个信令层从客户端,这将验证/确认服务器,如果它已经收到数据或没有。

你可以使用在端口5558另一REQ/REP层聆听(比方说)。

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

相关问题