2012-03-08 7 views
0

UDP 위에 RFC1350을 구현하려고합니다. 지금까지 모두 파일을 부드럽게 보내고 있습니다. 서버에서 클라이언트로 작업 한 것은 매력적이었습니다. 서버에 데이터를 수신하고 클라이언트에 데이터를 보내는 방법을 제공했지만이 방향은 아무 것도 아닙니다.파이썬 소켓이 데이터를받지 못한다

키 서버 코드 :

def listen(self): 
    while True: 
     packet, address = self.serverSocket.recvfrom(512) 

     mode = str(packet)[2:5] 
     self.file = str(str(packet)[6:]).replace("'", "") 

     if(mode == "RRQ"): 
      self.sendResponse(address) 
     else: 
      self.receiveData() 

def receiveData(self): 
    data = open("new1.jpg", "wb") 
    while True: 
     packet, server = self.serverSocket.recvfrom(512) 
     if packet.__len__() == 512: 
      data.write(packet) 
     else: 
      data.write(packet) 
      break; 

주요 클라이언트 코드 :

def sendWRQ(self): 
    request = 'WRQ-' + self.file 
    self.clientSocket.sendto(str(request).encode(), (self.serverAddress, self.serverPort)) 
    self.sendData() 

def sendData(self): 
    with open(self.file, "rb") as data: 
     while True: 
      packet = data.read(512) 
      if packet != b"": 
       self.clientSocket.sendto(packet, (self.serverAddress, self.serverPort)) 
      else: 
       self.clientSocket.sendto(packet, (self.serverAddress, self.serverPort)) 
       break 
      time.sleep(0.0005) 
  1. 클라이언트 WRQ 패킷이 전송
  2. 서버 recog의 열쇠가 될 것입니다 파일의 이름을 오순절 전송 . 전송 유형 RRQ 또는 WRQ를 수신하고 receiveData()를 통해 전송을 청취하기 시작합니다.

클라이언트 sendWRQ() 이제 문제는 내가 파일 오순절 0KB

를 얻을 같이 sendData 또는 receiveData에서 서버 또는 클라이언트 양쪽에서 발생을 전송 한 후 종료 코드의 모든 :

답변

0

방법 그 (CL) ient가 서버에 파일이 완료되었음을 알리면 올바르지 않습니다.

코드에서 파일이 완성되면 클라이언트 측에서 "sendto"를 호출하여 빈 문자열을 보내지 만 실제로는 아무 작업도 수행하지 않습니다. 서버 측에서는 "packet. len() == 512"라는 조건을 사용하여 파일이 완료되었는지 여부를 판단하지만 전송 프로세스 중에 서버 CPU가 전송 속도보다 빠르게 실행되는 경우 제로 패킷 길이가 빈번하지만, 이것은 전송이 완료되었음을 나타내지는 않을 것입니다. 아마도 다음 패킷이 막 진행 중일 것입니다.

나의 제안은 전송의 끝을 나타내는 특별한 명령을 사용하는 것이고, 서버는 명령이 수신 될 때만 루프를 깨뜨릴 것입니다.

+0

패킷에는 특성 len() ...이 없으면 __len __()과 동일한 결과를 반환합니다. 그러나 이것은 문제가되지 않습니다. 서버 간 전송은 작동하기 때문에. 마지막 패킷은 일반적으로 EOF 및 EOT를 나타내는 512보다 작습니다. –

+0

형식화 된 후 __len __()이 len()이되는 이유를 모릅니다. 나는 당신이 0kB 파일을 가지고있는 이유는 서버가 __len __() == 0으로 패킷을 수신 할 때 루프를 돌파한다는 것입니다. – ciphor

관련 문제