Основная проблема в tqdm. Нельзя одновременно использовать итератор
progress = tqdm.tqdm(range(filesize) ... for _ in progress:
и вручную обновлять прогресс, он будет глючить страшно (попробуйте, напишите простейший цикл:
r=tqdm.tqdm(range(100))
for i in r:
sleep(1)
r.update(10)
увидите, что будет.
tqdm глючит и не останавливает вовремя цикл приема на сервере. Когда файл полностью скачан, строчка
bytes_read = client_socket.recv(BUFFER_SIZE)
блокируется в ожидании новых данных и все виснет.
Вообще для блокирующих сокетов пустой результат recv - признак ошибки/закрытия соединения, если данных нет - recv() блокируется.
Вам надо или разобраться с tqdm, или считать длину полученных данных и прерывать цикл так:
if downloaded >= filesize:
break
Ну и в теории, вот это стремный подход:
received = client_socket.recv(BUFFER_SIZE).decode()
filename, filesize = received.split(SEPARATOR)
Никто не гарантирует вообще-то, что то, что вы послали отдельными пакетами (отдельными send) придет также отдельными пакетами (т.е. надо будет принимать данные отдельными recv). Данные могут буферизоваться и прийти одним пакетом. И вы прочитаете мусор.