2014-12-07 4 views
2

zmq 및 네트워크 프로그래밍을 처음 사용합니다. 나는 pyzmq 라이브러리를 사용하여 클라이언트와 서버간에 데이터를주고받는 간단한 함수를 작성하고자한다. (REQ/REP 패턴 사용).zeromq에서 데이터 전송을 확인하는 방법은 성공했는지 여부

def send_data(socket, data): 
    try: 
     socket.send(data) 
    except: 
     return False 
    return True 

데이터가 성공적으로 서버에 전송하면, 함수가이 서버로 전송되지 않은 경우, 함수가 false를 반환합니다 True를 반환합니다 내가 데이터를 전송하기 위해 한 일은 다음이었다. 위의 코드가 너무 순진하다는 것을 알고 있습니다.

데이터를 서버로 보내지 못하는 경우를 테스트하는 방법을 모르겠습니다. 내가 생각할 수있는 한 가지 방법은 데이터 전송을위한 타임 아웃을 설정하고 잘못된 포트로 데이터를 보내는 것입니다. 좀 더 구체적으로 말하자면 클라이언트 소켓을 포트 "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

+0

전혀! 업데이트를 참조하십시오. 그러나 네트워킹 통신을 위해 작성한 유일한 코드는 위에 있습니다. 아주 초기 단계에 있습니다. – ohmygoddess

답변

0

데이터를 수신했는지 여부를 확인하거나 확인하는 클라이언트 측 신호 레이어가 있어야합니다.

당신은 포트 5558 또 다른 REQ/REP 층 청취를 사용할 수 있습니다 (의 말을하자).

서버에서 데이터를 보낼 때마다 타이머를 설정하고 클라이언트가 해당 타이머 내에서 응답하면 데이터가 올바르게 전송된다는 의미입니다. 그렇지 않으면 클라이언트가 없음을 의미합니다.

관련 문제