2015-06-03 5 views
0

Сначала я отправляю запрошенный файл с сервера клиенту, после чего я хочу отправить вычисленный sha файла с сервера клиенту, чтобы клиент мог проверить, как sha из отправленного, так и полученных файлов одинаковы.множественная отправка от сервера к клиенту python

мне удается отправить файл, но когда я пытаюсь также послать ша (который является переменной) я получаю ошибку (я считаю, что ша также добавляется к содержимому файла)

Как может я отправить их отдельно?

if (reqCommand == 'get'): 
    with open (reqFile, 'rb') as in_file, open(encFile, "wb") as out_file: 
     encrypt(in_file, out_file, "abc") 
     f = open(encFile,'rb') 
     for data in f: 
      # print 'here3' 
      conn.sendall(data) 
     f.close() 

     file_sh = hashfile(reqFile) 
     print 'the sha1 function from the server: ', file_sh 
     conn.send(file_sh) 

и клиент:

while True: 
    data = sock.recv(1024) 

    if not data: 
     break 
    #print data 
    file_to_write.write(data) 

ответ

1

Вы должны перепроектировать немного, как работает приложение:

  • Первые серверы посылает клиенту размер файла.
  • Клиент считывает размер файла (преобразует его в число) и уведомляет сервер (например, отправляет «ОК» на сервер).
  • Сервер считывает «ОК» с клиента и начинает отправлять содержимое файла (желательно в небольших кусках).
  • Клиент продолжает считывать данные до тех пор, пока не будет прочитано точно file size байт или возникнет ошибка.
  • Если ошибка не была выполнена, клиент вычисляет хэш только что полученного файла и отправляет его на сервер.
  • Сервер считывает хэш из клиента и сравнивается с одним из его локального файла; если они совпадают, отправляет «ОК» клиенту «ОШИБКА» в противном случае.
  • Клиент считывает ответ от сервера: при получении «ERROR» файл удаляется.
+0

не могли бы вы дать мне короткий пример, пожалуйста? я все еще сталкиваюсь с проблемами – spoke

+0

, где именно у вас проблемы? Я не уверен, как писать код в комментариях. – CristiFati

+0

Чтобы запустить, я, вероятно, посмотрю позже или завтра. – CristiFati

0

Поток TCP должен быть отформатирован на обоих концах, поскольку это поток, а не пакеты. Я полагаю, вы могли бы искать нулевой байт ('\x00'), который должен сигнализировать конец файла.

+0

Двоичные файлы часто имеют '\ 0' в своем содержании. – CristiFati

+0

Мне нравится @ CristiFati's soltution. Отправьте длину файла, прочитайте это количество байтов, после чего вы знаете, что все готово. – Yurippenet

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