fork(1) download
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3.  
  4. import socket
  5. import struct
  6. import os
  7.  
  8. sock = socket.socket()
  9. sock.bind(('', 9090))
  10. sock.listen(1)
  11. conn, addr = sock.accept()
  12.  
  13. print('Connected: ', addr)
  14.  
  15. file_ext_len = struct.unpack('H', conn.recv(2))[0] # Получение длины расширения
  16. conn.send('OK'.encode('UTF-8')) # Отсылка OK, чтобы продолжилось выполнение кода
  17.  
  18. file_ext = struct.unpack('{}s'.format(file_ext_len), conn.recv(file_ext_len))[0].decode('UTF-8') # Получение расширения файла, распаковка и расшифровка
  19. conn.send('OK'.encode('UTF-8')) # Отсылка OK, чтобы клиент понял, что данные дошли.
  20.  
  21. files = sorted([file for file in os.listdir() if file.endswith(file_ext)]) # Создается отсортированный список файлов, находящихся в одной папке с файлом server и имеющих необходимое расширение
  22.  
  23. quantity_of_files = struct.pack('Q', len(files)) # Запаковывается количество файлов в папке и отсылается клиенту, чтобы он знал, сколько файлов принимать
  24. conn.send(quantity_of_files) # Отсылание количества файлов с необходимым расширением, находящихся в папке, клиенту
  25.  
  26.  
  27. for file in files: # Итерации по именам файлов в папке, имеющих необходимое расширение
  28. with open(file, mode='rb') as open_file: # Открывается файл
  29. read_file = open_file.read() # Файл считывается в переменную (записывается в оперативную память
  30.  
  31. file_size = len(read_file) # Определение размера файла в байтах
  32. encoded_filename = file.encode('UTF-8') # Декодируется имя файла, чтобы его затем запакавать и отправить (таким образом вводится поддержка UNICODE)
  33. file_name_size = len(encoded_filename) # Определение размера имени файла в байтах
  34.  
  35. struct_file_size = struct.pack('Q', file_size) # Запаковывается размер файла
  36. struct_file_name_size = struct.pack('H', file_name_size) # Запаковывается размер имени файла в байтах (максимум - 32768 символов)
  37. struct_file_name = struct.pack('{}s'.format(file_name_size), encoded_filename) # Запаковывается имя файла
  38.  
  39. conn.send(struct_file_size) # Отсылается размер файла
  40. if conn.recv(2).decode("UTF-8") == "OK": # Ждет получения OK
  41. conn.send(struct_file_name_size) # Отсылает размер имени файла
  42. if conn.recv(2).decode("UTF-8") == "OK": # Ждет получения OK
  43. conn.send(struct_file_name) # Отсылает имя файла
  44. if conn.recv(2).decode("UTF-8") == "OK": # Ждет получения OK
  45. conn.send(read_file) # Отсылает файл
  46. if conn.recv(2).decode("UTF-8") == "OK": # Ждет получения OK
  47. print(file, ' transmitted') # Вывыодит сообщение об окончании передачи файла
  48. continue
  49.  
  50. conn.close() # Закрывает сокет
  51. sock.close()
  52.  
  53. input('Press Enter to close')
  54.  
  55.  
  56.  
Time limit exceeded #stdin #stdout 5s 10712KB
stdin
Standard input is empty
stdout
Standard output is empty