/
xinvestoriginal
/
CiberDogEvolution
Обзор
Документация
Войти
/
xinvestoriginal
/
CiberDogEvolution
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
python-dog-name-learn/server.py
111 строк
5 KB
den
исправлены ошибки передачи файлов на сервер
27 май 2025, 07:00
27 май 2025, 07:00
556d6f1
Код
Авторство
О чём код?
import socket import threading import struct import os from pathlib import Path # рекурсивное удаление директории def rmdir(directory): directory = Path(directory) for item in directory.iterdir(): if item.is_dir(): rmdir(item) else: item.unlink() directory.rmdir() # обработка подключение сокет-клиента def handle_client(client_socket, addr): datasetPath = "dataset" buffer = bytearray() dataSize = 4 while len(buffer) < dataSize: buffer += client_socket.recv(16) dataType = struct.unpack('>i', buffer[dataSize - 4:dataSize])[0] print("Данные тип: " + str(dataType)) if dataType == 2: print("очистка директории отключена и должна производиться вручную") #if os.path.exists(datasetPath): # rmdir(datasetPath) if dataType == 1: #--------------------------------------------------------------------------------------------------------------- if not os.path.exists(datasetPath): os.makedirs(datasetPath) namePath = datasetPath + "/name" if not os.path.exists(namePath): os.makedirs(namePath) nonamePath = datasetPath + "/noname" if not os.path.exists(nonamePath): os.makedirs(nonamePath) #--------------------------------------------------------------------------------------------------------------- dataSize += 4 while len(buffer) < dataSize: buffer += client_socket.recv(16) fileNameSize = struct.unpack('>i', buffer[dataSize - 4:dataSize])[0] #print("\nРазмер имени файла: " + str(fileNameSize)) dataSize += fileNameSize while len(buffer) < dataSize: buffer += client_socket.recv(4096) fileName = buffer[dataSize - fileNameSize:dataSize].decode('utf-8') print("Имя файла: " + fileName) if fileName.startswith("name"): fileName = namePath + "/" +fileName else: fileName = nonamePath + "/" + fileName dataSize += 4 while len(buffer) < dataSize: buffer += client_socket.recv(16) fileSize = struct.unpack('>i', buffer[dataSize - 4:dataSize])[0] #print("Размер файла: " + str(fileSize)) # Извлекаем данные файла, уже находящиеся в буфере после заголовков file_data_start = dataSize remaining_data = buffer[file_data_start:] # Открытие файла для записи в бинарном режиме bytes_count_load = 0 with open(fileName, 'wb') as file: # Записываем оставшиеся данные из буфера if remaining_data: len_initial = min(len(remaining_data), fileSize) file.write(remaining_data[:len_initial]) bytes_count_load += len_initial #print(f"Скачано из буфера: {len_initial}, всего: {bytes_count_load}") while True: # Чтение данных из сокета (блоками по 4096 байт) data = client_socket.recv(min(4096, fileSize - bytes_count_load)) #lenData = min(len(data),fileSize - bytesCountLoad) lenData = len(data) if not data: break # Прерывание цикла, если данные закончились # Запись полученных данных в файл file.write(data[:lenData]) bytes_count_load += lenData #print("Скачено данных: " + str(lenData) + " всего: " + str(bytes_count_load)) if bytes_count_load >= fileSize: dataSize += bytes_count_load print("\nЗакачен файл размером: " + str(bytes_count_load)) file.close() break #client_socket.send('ok.'.encode("utf-8")) client_socket.close() # Создаем TCP сокет (SOCK_STREAM) def exec_server(): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket: # Привязываем сокет к адресу и порту server_socket.bind(('0.0.0.0', 20000)) # Начинаем слушать подключения (максимум 5 в очереди) server_socket.listen(5) print("Сервер запущен. Ожидание подключений...") try: while True: # Принимаем новое подключение client_socket, addr = server_socket.accept() print(f"Подключился клиент: {addr}") client_thread = threading.Thread(target=handle_client, args=(client_socket, addr)) client_thread.start() except KeyboardInterrupt: print("\nСервер остановлен.")