Проблема при загрузке файла с клиента на сервер

avatar
Luka Igrutinovic
8 августа 2021 в 15:39
40
1
1

Я работаю над программой, которая создает резервные копии таких файлов, как OneDrive или iCloud.

У меня все работает, но когда я отправляю файл через сокеты, он просто зависает, пока я не закрываю соединение.

Вот пример кода:

Клиент:

def UpdateFileOnServer(file):
    print("[!] Uploading file to server: ",file)
    with open(clientFolder+file,"rb") as f:
        s.sendall(file.encode())
        file = f.read()
        s.sendall(file)
    print("[!] File has been sent.")

Сервер:

with open(fileLocation,"wb") as f:
    print("[!] File recieved! Downloading...")
    while True:
        data = conn.recv(4096)
        if not data:f.close();break
        f.write(data)

Итак, еще раз резюмируем:

  • Клиент отправляет файл и говорит, что он был отправлен.
  • Сервер получает около 90% файла и зависает на неопределенное время, пока я не нажму CTRL+C на клиенте
  • Когда я это делаю, сервер завершает передачу файла, и файл успешно получен.
Источник
9769953
8 августа 2021 в 15:41
0

Насколько велик файл?

Luka Igrutinovic
8 августа 2021 в 15:41
0

Файл 15кб

9769953
8 августа 2021 в 15:46
0

Какой именно размер?

Luka Igrutinovic
8 августа 2021 в 15:50
0

Хорошо, поэтому мне нужно сначала отправить фактический размер файла, а затем получить файл, пока я не нажму на отметку размера, затем я прерываюсь и жду новых. Правильно ли я понял?

Daniel Kleinstein
8 августа 2021 в 15:53
0

Я запустил ваш код, и он отлично работает на моей машине со случайно сгенерированным файлом размером 15 КБ.

Luka Igrutinovic
8 августа 2021 в 16:00
0

Это все еще не работает правильно на моей машине. Я попытаюсь создать отдельные файлы и запустить их, чтобы посмотреть, не напутал ли я что-то в интеграции.

OneCricketeer
8 августа 2021 в 16:06
0

Возможно, вам будет лучше с ftp-сервером

Luka Igrutinovic
8 августа 2021 в 16:07
0

Спасибо, попробую и отпишусь, если получится! Спасибо вам всем.

Ответы (1)

avatar
Luka Igrutinovic
8 августа 2021 в 18:26
0

Благодаря всем любезным комментаторам я нашел ответ на свою проблему.

  • Создать серверный сокет.
  • Подключение клиентского сокета к серверному сокету.
  • Отправить файл с клиентом на сервер.
  • Когда клиент подтверждает, что файл отправлен, вы закрываете соединение.
  • Сервер продолжает прослушивать подключения.
  • Промыть и повторить!