@HunLZy

Python не выходит из цикла while, что делать?

Я делаю сервер-клиентское приложение, где клиент может загружать файлы на сервер и скачивать от туда (что то типа облака), но при реализации загрузки файлов из сервера столкнулся с проблемой
o_file = open(name_file, 'wb')
	file_data = client.recv(524288)
	o_file.write(file_data)
	while file_data:
		file_data = client.recv(524288)
		o_file.write(file_data)
	o_file.close()
	client.close()

программа не выходит из цикла while, перепробовал все что возможно, но безрезультатно(сам файл скачивается правильно и его можно открыть, если завершить работу программы принудительно)
  • Вопрос задан
  • 203 просмотра
Пригласить эксперта
Ответы на вопрос 3
mayton2019
@mayton2019
Bigdata Engineer
Мне кажется я понимаю в чем проблема автора. Socket - это не файл.
Это просто стриминговый протокол по которому можно ждать данных
бесконечно. Потому что никакого маркера конца нету.

Тут нужно договориться что либо сервер закрывает соединение после отдачи файла.
Либо клиент сам отваливается когда детектирует либо принятие числа байтов
либо специальный байт маркер EOT (как договоритесь).
Ответ написан
Комментировать
после открытия файла данные считываются лишь одинажды и затем код проверяет в цикле одно и то же:
while file_data:
что логично. Ведь данные не изменились.

Чтобы исправить, нужно изменить на
while True:
    file_data = client.recv(524288) # или указать размер поменьше
    if not file_data:
        break
    o_file.write(file_data)

И лучше писать так:
with open(name_file, 'wb') as o_file:
    while True:
        file_data = client.recv(524288)
        if not file_data:
            break
        o_file.write(file_data)

client.close()
Ответ написан
HemulGM
@HemulGM Куратор тега Python
Delphi Developer, сис. админ
Функция client.recv() будет висеть, пока данные не придут, причем размером с буфер. Работать с сокетом нужно не так
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы