【发布时间】: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 根本不足以满足您上面的要求。谢谢 -
一点也不!请查看更新。但是,上面是我为网络通信编写的唯一代码。它还处于起步阶段。