2014-12-09 2 views
0

Я использую приведенный ниже код Python для передачи больших файлов между сервером и клиентом с использованием zeromq.EOF на передачу файла zeromq

Реализация отправить файл, сервер

CHUNK_SIZE = 250000 

    message = pair.recv() # message is the path to the file 

    filename = open(message, 'rb') 
    filesize = os.path.getsize(message) 

    offsets = (int(ceil(filesize/CHUNK_SIZE)), 0)[filesize <= CHUNK_SIZE] 

    for offset in range(offsets + 1): 
     filename.seek(offset) 

     chunksize = CHUNK_SIZE 

     if offset == offsets: 
      chunksize = filesize - (CHUNK_SIZE * (offset - 1)) # calculate the size of the last chunk 

     data = filename.read(chunksize) 

     pair.send(data) 

    pair.send(b'') 

Реализация получить файл, клиент

while True: 
    data = pairs.recv() 

    if data is not '': 
     target.write(data) 
    else: 
     break 

Однако после передачи большого файла с помощью этой реализации, по какой-либо причине дополнительного данные добавляются в конце файла:

файла на стороне сервера

$ stat file.zip 
    File: `file.zip' 
    Size: 1503656416 Blocks: 2936840 IO Block: 4096 regular file 

стороне клиента

$ stat file.zip 
    File: `file.zip' 
    Size: 1503906416 Blocks: 2937328 IO Block: 4096 regular file 

Размер и блоки отличаются между ними.

У вас есть предложения по правильному вычислению/отправке конца файла?

Thanks

ответ

1

Просто нашли решение. seek() не обрабатывал куски должным образом.

-filename.seek(offset) 
+filename.seek(0, 1) 

Таким образом, он всегда будет получать смещение 0 по текущей (последней) позиции.

Теперь все работает как ожидалось :)

Смежные вопросы