2012-04-22 4 views
1

두 대의 컴퓨터를 사용하여 송수신 알고리즘을 구현하여 프레임을 송수신해야합니다. 나는 강력한 프로그래머이지만 네트워크 프로그래밍과 파이썬에 대해서는 상대적으로 새로운 것입니다. 알고리즘은 다음과 같습니다.Python에서 "Simplest Protocol"의사 코드 알고리즘 구현

보낸 현장 알고리즘 :

while(true) 
{ 
    WaitForEvent(); 
    if(Event(RequestToSend)) 
    { 
     GetData(); 
     MakeFrame(); 
     SendFrame(); 
    } 

수신기 현장 알고리즘 :

while(true) 
{ 
    WaitForEvent(); 
    if(Event(ArrivalNotification)) 
    { 
     ReceiveFrame(); 
     ExtractData(); 
     DeliverData(); 
    } 

나는 두 개의 별도의 컴퓨터, 보낸 사람 하나와 수신기 같은 다른 한편으로 이러한 알고리즘을 구현해야합니다. 어디서부터 시작해야할지 모르는가? 나는 운이 좋은 약간 연구를했다. 누군가 구현할 때 예제 코드 나 좋은 기사를 제공 할 수 있다면 많은 도움이 될 것입니다.

+1

토네이도가 갈 수있는 방법입니다) – jldupont

답변

3

저는 파이썬의 Socket Server 예제를 사용하고 있습니다. 그러면 SendFrame(), ReceiveFrame()DeliverData() 루틴으로 이동하게됩니다.

MakeFrame()ExtractData()은 전송할 데이터의 양에 따라 크게 달라질 수 있습니다. 나는 과거에 사용한 좋은 모범을 파헤 치려고 노력할 것이다.

1 스톱 솔루션을 찾고있는 경우 Twisted을 살펴볼 것을 권합니다. 명확한 학습 곡선이 있지만 그만한 가치가있을 것입니다. pyInstaller 또는 py2exe을 사용하여 파이썬 코드를 exe에 패키지화하려는 경우 Twisted는 내가 읽은 스레드 수에 따라 문제를 일으킬 수 있습니다.

그래서 내 노트를 뒤돌아보고, 좋은 예를 찾을 수 없으므로 프레이밍 측면이 나에게 아픈 주제였습니다. 나는 처음부터 하나를 썼다. 그리고 그것을 수정했다.

소켓 프로그래밍을 읽었을 때 모든 데이터 (socket.sendall())를 전송한다고해서 반드시 첫 번째 socket.recv() 이후에 수신된다는 의미는 아닙니다. 메시지 프레임 질문에 약간의 복잡성이 추가됩니다. 웹상에 예제가 없기 때문에, 아래에서 몇 가지 프로세스에서 지금 사용하고있는 버전을 제거했습니다.


업데이트
그래서 이후에 더 난 도망 정규식에서 이동 크게 성능을 개선 문자 스트림 문자를 처리/파열에서 무거운 테스트.

SendFrame(), ReceiveFrame(), ExtractData(), DeliverData() 예 :

MESSAGE_FRAME_START = '@' 
MESSAGE_FRAME_END = '#' 

def process_raw_socket_message_stream(raw_message_stream): 
    message_list = [] 
    cmd = '' 
    last_footer_idx = message_string.rfind(MESSAGE_FRAME_END) 
    cmd_str_len = len(message_string) 
    byte_cnt = 0 
    while (byte_cnt <= last_footer_idx): 
     cmd_chr = message_string[byte_cnt] 
     cmd += cmd_chr 
     if cmd_chr == MESSAGE_FRAME_START: 
      cmd = MESSAGE_FRAME_START 
     elif cmd_chr == MESSAGE_FRAME_END: 
      message_list.append(cmd) 

     byte_cnt += 1 

    # Remove the parsed data 
    if last_footer_idx > 0: 
     message_string = message_string[last_footer_idx+1:] 

    return message_list, message_string 

def add_message_frames(unframed_message): 
    return MESSAGE_FRAME_START + unframed_message + MESSAGE_FRAME_END 

def remove_message_frames(framed_message): 
    clean_message = framed_message.lstrip(MESSAGE_FRAME_START) 
    clean_message = clean_message.rstrip(MESSAGE_FRAME_END) 
    return clean_message 

def process_messsage(clean_message): 
    # Do what needs to be done 
    pass 

def send_data(mysocket, payload): 
    framed_payload = add_message_frames(payload) 
    mysocket.sendall(framed_payload) 

def receive_data(mysocket, byte_size=1024): 
    data = '' 
    while(1): 
     try: # Wait for data 
      data += mysocket.recv(byte_size) 
      if(data != '') and (data != None): 
       # Decode all messsages 
       message_list, remaining_data = process_raw_socket_message_stream(data) 

       # Process all of the messages 
       for messsage in message_list: 
        process_messsage(remove_message_frames(message)) 

       # Store the remaining data 
       data = remaining_data 
     except: 
      print "Unexpected Error" 
+0

이 훌륭한 자원입니다! 모든 의견을 보내 주셔서 감사합니다. – dremme