2016-10-16 3 views
1

파이썬으로 작성된 내 Windows PC에 간단한 서버가있어 디렉토리에서 파일을 읽은 다음 TCP를 통해 클라이언트로 파일을 보냅니다.파이썬 서버가 TCP를 통해 잘린 이미지를 보내고 있습니다

HTML 및 자바 스크립트와 같은 파일을 클라이언트가 올바르게 수신합니다 (보낸 파일과 원본 파일이 일치 함).
이미지 데이터가 잘리지 않습니다.입니다.

이상하게도 이미지가 다른 길이로 잘리지 만 이미지마다 일관됩니다.
예를 들어 특정 1MB JPG는 항상 95 바이트로 수신됩니다. 7KB가되어야하는 다른 이미지는 120 바이트로 수신됩니다.

잘린 이미지 파일을 메모장 ++에서 열면 인 데이터는입니다. (유일한 문제는 파일이 너무 빨리 끝나는 것입니다).
파일의 끝 부분에 패턴이 표시되지 않습니다. 잘라 내기 직전과 직후의 chars/bytes는 이미지마다 다릅니다.

서버에서 파일을 읽는 세 가지 방법을 시도했지만 모두 동일한 결과가 나타납니다. 파일의 크기 콘솔에

print ("Cache size=" + str(os.stat(filename).st_size)) 

#1st attempt, using readlines 
fileobj = open(filename, "r") 
cacheBuffer = fileobj.readlines() 
for i in range(0, len(cacheBuffer)): 
    tcpCliSock.send(cacheBuffer[i]) 

#2nd attempt, using line, same result 
with open(filename) as f: 
    for line in f: 
     tcpCliSock.send(f) 

#3rd attempt, using f.read(), same result 
with open(filename) as f: 
    tcpCliSock.send(f.read()) 

스크립트 인쇄 : 여기

은 독서의 조각 파일의 전송입니다 읽기 및 바이트 수 matche 원본 이미지. 그래서 이것은 문제가 파견에 있음을 증명합니다, 그렇죠?
문제가 전송과 관련된 경우 전체 이미지를 제대로 보내려면 무엇을 변경할 수 있습니까?

답변

3

이진 파일 인 이미지를 다루므로 바이너리 모드에서 파일을 열어야합니다. 파이썬 문서에서

open(filename, 'rb') 

open()을 위해 :

기본은 읽기에 다시 쓰기에 플랫폼 고유의 표현으로 '\n' 문자를 변환 할 수 있습니다 텍스트 모드를 사용하는 것입니다. 따라서 이진 파일을 열 때 'b'을 모드 값에 추가하여 파일을 이진 모드로 열면 이식성이 향상됩니다. (이 문서의 역할을 어디 'b'을 추가하면, 다르게도 바이너리 취급하지 않는 시스템 및 텍스트 파일에 유용합니다.)

서버는 read 파일로, 파이썬은 모든 변환되고, 윈도우에서 실행되기 때문에 \r\n\n입니다. 텍스트 파일의 경우이 방법이 유용합니다. \n 문자 만 처리하는 플랫폼 독립적 인 코드를 작성할 수 있습니다. 이진 파일의 경우이 은 데이터을 완전히 손상시킵니다.따라서 이진 파일을 처리 할 때는 'b'을 사용하는 것이 중요하지만 텍스트 파일을 다룰 때이 파일을 사용하지 않는 것이 중요합니다. 또한


, TCP는 스트림 프로토콜로, 그것은 작은 조각의 소켓에 스트림 데이터에 좋습니다. 이렇게하면 전체 파일을 메모리로 읽어 들일 필요가 없으므로 메모리 사용량을 줄일 수 있습니다. 좋아요 :

with open(filename, 'rb') as f: 
    while True: 
     data = f.read(4096) 
     if len(data) == 0: 
      break 
     tcpCliSock.send(data) 
+0

확인 된 작업! – Bort

+0

항상 바이너리 모드를 사용하지 않는 이유가 있습니까? 그게 어떤 텍스트에 문제가되는 것입니까? – Bort

관련 문제