我是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將爲我完成這項工作。我只需要知道數據是否被接收。那是對的嗎?
你介意發佈整個ZMQ上下文設置等嗎?獲得用例的答案非常重要。 **'send_data()'**函數的源代碼片段根本不足以滿足您在上面提出的要求。謝謝 – user3666197 2014-12-07 12:04:09
一點都不!請參閱更新。但是,以上是我爲網絡通信編寫的唯一代碼。它正處於開始階段。 – ohmygoddess 2014-12-07 16:05:57