В настоящее время у меня есть реализация сервера (Perl) и клиента (PHP), которая может отправлять файлы с клиента на сервер. Эти системы работают без проблем уже более 5 лет, поэтому я вполне уверен, что реализация верна.
Мне нужно заменить реализацию PHP на python. Я написал код клиента для отправки файла в python, например:
self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self._sock.connect((host, port))
hash_md5 = hashlib.md5()
f = open(file_source_full_path, 'rb')
chunk = f.read(1024)
while chunk:
self._sock.send(chunk)
hash_md5.update(chunk)
chunk = f.read(1024)
f.close()
self.log.debug("MD5 %s ..." % hash_md5.hexdigest())
self._sock.shutdown(socket.SHUT_WR)
self._sock.close()
Эта реализация в настоящее время работает правильно для небольших файлов. Если файл большой (например, 1.6 Мб), он не работает. Не все данные передаются - они передают что-то между 1,1 и 1,3 Мб.
Согласно проверке MD5, все файлы фактически отправляются, но некоторые данные теряются где-то, и я не могу понять, что это является.
Любая помощь в устранении или устранении проблемы будет принята с благодарностью.
ОБНОВЛЕНИЕ
Я только что выполнил дополнительную отладку. Все данные отправляются клиентом, но один раз прекращает отправку данных и закрывает соединение, сервер прекращает получать данные, которые находятся в пути.
Я нашел решение этой проблемы: если я добавлю time.sleep(5)
прямо перед self._sock.shutdown(socket.SHUT_WR)
, он будет работать, как и ожидалось.
Как правильно дождаться получения клиентом всей информации?