Отправка файлов с использованием Python Socket: соединение закрывается слишком рано - PullRequest
0 голосов
/ 30 марта 2020

В настоящее время у меня есть реализация сервера (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), он будет работать, как и ожидалось.

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

...