#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
import struct
import os
sock = socket .socket ( )
sock.bind ( ( '' , 9090 ) )
sock.listen ( 1 )
conn, addr = sock.accept ( )
print ( 'Connected: ' , addr)
file_ext_len = struct .unpack ( 'H' , conn.recv ( 2 ) ) [ 0 ] # Получение длины расширения
conn.send ( 'OK' .encode ( 'UTF-8' ) ) # Отсылка OK, чтобы продолжилось выполнение кода
file_ext = struct .unpack ( '{}s' .format ( file_ext_len) , conn.recv ( file_ext_len) ) [ 0 ] .decode ( 'UTF-8' ) # Получение расширения файла, распаковка и расшифровка
conn.send ( 'OK' .encode ( 'UTF-8' ) ) # Отсылка OK, чтобы клиент понял, что данные дошли.
files = sorted ( [ file for file in os .listdir ( ) if file .endswith ( file_ext) ] ) # Создается отсортированный список файлов, находящихся в одной папке с файлом server и имеющих необходимое расширение
quantity_of_files = struct .pack ( 'Q' , len ( files) ) # Запаковывается количество файлов в папке и отсылается клиенту, чтобы он знал, сколько файлов принимать
conn.send ( quantity_of_files) # Отсылание количества файлов с необходимым расширением, находящихся в папке, клиенту
for file in files: # Итерации по именам файлов в папке, имеющих необходимое расширение
with open ( file , mode= 'rb' ) as open_file: # Открывается файл
read_file = open_file.read ( ) # Файл считывается в переменную (записывается в оперативную память
file_size = len ( read_file) # Определение размера файла в байтах
encoded_filename = file .encode ( 'UTF-8' ) # Декодируется имя файла, чтобы его затем запакавать и отправить (таким образом вводится поддержка UNICODE)
file_name_size = len ( encoded_filename) # Определение размера имени файла в байтах
struct_file_size = struct .pack ( 'Q' , file_size) # Запаковывается размер файла
struct_file_name_size = struct .pack ( 'H' , file_name_size) # Запаковывается размер имени файла в байтах (максимум - 32768 символов)
struct_file_name = struct .pack ( '{}s' .format ( file_name_size) , encoded_filename) # Запаковывается имя файла
conn.send ( struct_file_size) # Отсылается размер файла
if conn.recv ( 2 ) .decode ( "UTF-8" ) == "OK" : # Ждет получения OK
conn.send ( struct_file_name_size) # Отсылает размер имени файла
if conn.recv ( 2 ) .decode ( "UTF-8" ) == "OK" : # Ждет получения OK
conn.send ( struct_file_name) # Отсылает имя файла
if conn.recv ( 2 ) .decode ( "UTF-8" ) == "OK" : # Ждет получения OK
conn.send ( read_file) # Отсылает файл
if conn.recv ( 2 ) .decode ( "UTF-8" ) == "OK" : # Ждет получения OK
print ( file , ' transmitted' ) # Вывыодит сообщение об окончании передачи файла
continue
conn.close ( ) # Закрывает сокет
sock.close ( )
input ( 'Press Enter to close' )
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwojIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKaW1wb3J0IHNvY2tldAppbXBvcnQgc3RydWN0CmltcG9ydCBvcwoKc29jayA9IHNvY2tldC5zb2NrZXQoKQpzb2NrLmJpbmQoKCcnLCA5MDkwKSkKc29jay5saXN0ZW4oMSkKY29ubiwgYWRkciA9IHNvY2suYWNjZXB0KCkKCnByaW50KCdDb25uZWN0ZWQ6ICcsIGFkZHIpCgpmaWxlX2V4dF9sZW4gPSBzdHJ1Y3QudW5wYWNrKCdIJywgY29ubi5yZWN2KDIpKVswXSAgIyDQn9C+0LvRg9GH0LXQvdC40LUg0LTQu9C40L3RiyDRgNCw0YHRiNC40YDQtdC90LjRjwpjb25uLnNlbmQoJ09LJy5lbmNvZGUoJ1VURi04JykpICAjINCe0YLRgdGL0LvQutCwIE9LLCDRh9GC0L7QsdGLINC/0YDQvtC00L7Qu9C20LjQu9C+0YHRjCDQstGL0L/QvtC70L3QtdC90LjQtSDQutC+0LTQsAoKZmlsZV9leHQgPSBzdHJ1Y3QudW5wYWNrKCd7fXMnLmZvcm1hdChmaWxlX2V4dF9sZW4pLCBjb25uLnJlY3YoZmlsZV9leHRfbGVuKSlbMF0uZGVjb2RlKCdVVEYtOCcpICAjINCf0L7Qu9GD0YfQtdC90LjQtSDRgNCw0YHRiNC40YDQtdC90LjRjyDRhNCw0LnQu9CwLCDRgNCw0YHQv9Cw0LrQvtCy0LrQsCDQuCDRgNCw0YHRiNC40YTRgNC+0LLQutCwCmNvbm4uc2VuZCgnT0snLmVuY29kZSgnVVRGLTgnKSkgICMg0J7RgtGB0YvQu9C60LAgT0ssINGH0YLQvtCx0Ysg0LrQu9C40LXQvdGCINC/0L7QvdGP0LssINGH0YLQviDQtNCw0L3QvdGL0LUg0LTQvtGI0LvQuC4KCmZpbGVzID0gc29ydGVkKFtmaWxlIGZvciBmaWxlIGluIG9zLmxpc3RkaXIoKSBpZiBmaWxlLmVuZHN3aXRoKGZpbGVfZXh0KV0pICAjINCh0L7Qt9C00LDQtdGC0YHRjyDQvtGC0YHQvtGA0YLQuNGA0L7QstCw0L3QvdGL0Lkg0YHQv9C40YHQvtC6INGE0LDQudC70L7Qsiwg0L3QsNGF0L7QtNGP0YnQuNGF0YHRjyDQsiDQvtC00L3QvtC5INC/0LDQv9C60LUg0YEg0YTQsNC50LvQvtC8IHNlcnZlciDQuCDQuNC80LXRjtGJ0LjRhSDQvdC10L7QsdGF0L7QtNC40LzQvtC1INGA0LDRgdGI0LjRgNC10L3QuNC1CgpxdWFudGl0eV9vZl9maWxlcyA9IHN0cnVjdC5wYWNrKCdRJywgbGVuKGZpbGVzKSkgICMg0JfQsNC/0LDQutC+0LLRi9Cy0LDQtdGC0YHRjyDQutC+0LvQuNGH0LXRgdGC0LLQviDRhNCw0LnQu9C+0LIg0LIg0L/QsNC/0LrQtSDQuCDQvtGC0YHRi9C70LDQtdGC0YHRjyDQutC70LjQtdC90YLRgywg0YfRgtC+0LHRiyDQvtC9INC30L3QsNC7LCDRgdC60L7Qu9GM0LrQviDRhNCw0LnQu9C+0LIg0L/RgNC40L3QuNC80LDRgtGMCmNvbm4uc2VuZChxdWFudGl0eV9vZl9maWxlcykgICMg0J7RgtGB0YvQu9Cw0L3QuNC1INC60L7Qu9C40YfQtdGB0YLQstCwINGE0LDQudC70L7QsiDRgSDQvdC10L7QsdGF0L7QtNC40LzRi9C8INGA0LDRgdGI0LjRgNC10L3QuNC10LwsINC90LDRhdC+0LTRj9GJ0LjRhdGB0Y8g0LIg0L/QsNC/0LrQtSwg0LrQu9C40LXQvdGC0YMKCgpmb3IgZmlsZSBpbiBmaWxlczogICMg0JjRgtC10YDQsNGG0LjQuCDQv9C+INC40LzQtdC90LDQvCDRhNCw0LnQu9C+0LIg0LIg0L/QsNC/0LrQtSwg0LjQvNC10Y7RidC40YUg0L3QtdC+0LHRhdC+0LTQuNC80L7QtSDRgNCw0YHRiNC40YDQtdC90LjQtQogICAgd2l0aCBvcGVuKGZpbGUsIG1vZGU9J3JiJykgYXMgb3Blbl9maWxlOiAgIyDQntGC0LrRgNGL0LLQsNC10YLRgdGPINGE0LDQudC7CiAgICAgICAgcmVhZF9maWxlID0gb3Blbl9maWxlLnJlYWQoKSAgIyDQpNCw0LnQuyDRgdGH0LjRgtGL0LLQsNC10YLRgdGPINCyINC/0LXRgNC10LzQtdC90L3Rg9GOICjQt9Cw0L/QuNGB0YvQstCw0LXRgtGB0Y8g0LIg0L7Qv9C10YDQsNGC0LjQstC90YPRjiDQv9Cw0LzRj9GC0YwKCiAgICAgICAgZmlsZV9zaXplID0gbGVuKHJlYWRfZmlsZSkgICMg0J7Qv9GA0LXQtNC10LvQtdC90LjQtSDRgNCw0LfQvNC10YDQsCDRhNCw0LnQu9CwINCyINCx0LDQudGC0LDRhQogICAgICAgIGVuY29kZWRfZmlsZW5hbWUgPSBmaWxlLmVuY29kZSgnVVRGLTgnKSAgIyDQlNC10LrQvtC00LjRgNGD0LXRgtGB0Y8g0LjQvNGPINGE0LDQudC70LAsINGH0YLQvtCx0Ysg0LXQs9C+INC30LDRgtC10Lwg0LfQsNC/0LDQutCw0LLQsNGC0Ywg0Lgg0L7RgtC/0YDQsNCy0LjRgtGMICjRgtCw0LrQuNC8INC+0LHRgNCw0LfQvtC8INCy0LLQvtC00LjRgtGB0Y8g0L/QvtC00LTQtdGA0LbQutCwIFVOSUNPREUpCiAgICAgICAgZmlsZV9uYW1lX3NpemUgPSBsZW4oZW5jb2RlZF9maWxlbmFtZSkgICMg0J7Qv9GA0LXQtNC10LvQtdC90LjQtSDRgNCw0LfQvNC10YDQsCDQuNC80LXQvdC4INGE0LDQudC70LAg0LIg0LHQsNC50YLQsNGFCgogICAgICAgIHN0cnVjdF9maWxlX3NpemUgPSBzdHJ1Y3QucGFjaygnUScsIGZpbGVfc2l6ZSkgICMg0JfQsNC/0LDQutC+0LLRi9Cy0LDQtdGC0YHRjyDRgNCw0LfQvNC10YAg0YTQsNC50LvQsAogICAgICAgIHN0cnVjdF9maWxlX25hbWVfc2l6ZSA9IHN0cnVjdC5wYWNrKCdIJywgZmlsZV9uYW1lX3NpemUpICAjINCX0LDQv9Cw0LrQvtCy0YvQstCw0LXRgtGB0Y8g0YDQsNC30LzQtdGAINC40LzQtdC90Lgg0YTQsNC50LvQsCDQsiDQsdCw0LnRgtCw0YUgKNC80LDQutGB0LjQvNGD0LwgLSAzMjc2OCDRgdC40LzQstC+0LvQvtCyKQogICAgICAgIHN0cnVjdF9maWxlX25hbWUgPSBzdHJ1Y3QucGFjaygne31zJy5mb3JtYXQoZmlsZV9uYW1lX3NpemUpLCBlbmNvZGVkX2ZpbGVuYW1lKSAgIyDQl9Cw0L/QsNC60L7QstGL0LLQsNC10YLRgdGPINC40LzRjyDRhNCw0LnQu9CwCgogICAgICAgIGNvbm4uc2VuZChzdHJ1Y3RfZmlsZV9zaXplKSAgIyDQntGC0YHRi9C70LDQtdGC0YHRjyDRgNCw0LfQvNC10YAg0YTQsNC50LvQsAogICAgICAgIGlmIGNvbm4ucmVjdigyKS5kZWNvZGUoIlVURi04IikgPT0gIk9LIjogICMg0JbQtNC10YIg0L/QvtC70YPRh9C10L3QuNGPIE9LCiAgICAgICAgICAgIGNvbm4uc2VuZChzdHJ1Y3RfZmlsZV9uYW1lX3NpemUpICAjINCe0YLRgdGL0LvQsNC10YIg0YDQsNC30LzQtdGAINC40LzQtdC90Lgg0YTQsNC50LvQsAogICAgICAgICAgICBpZiBjb25uLnJlY3YoMikuZGVjb2RlKCJVVEYtOCIpID09ICJPSyI6ICAjINCW0LTQtdGCINC/0L7Qu9GD0YfQtdC90LjRjyBPSwogICAgICAgICAgICAgICAgY29ubi5zZW5kKHN0cnVjdF9maWxlX25hbWUpICAjINCe0YLRgdGL0LvQsNC10YIg0LjQvNGPINGE0LDQudC70LAKICAgICAgICAgICAgICAgIGlmIGNvbm4ucmVjdigyKS5kZWNvZGUoIlVURi04IikgPT0gIk9LIjogICMg0JbQtNC10YIg0L/QvtC70YPRh9C10L3QuNGPIE9LCiAgICAgICAgICAgICAgICAgICAgY29ubi5zZW5kKHJlYWRfZmlsZSkgICMg0J7RgtGB0YvQu9Cw0LXRgiDRhNCw0LnQuwogICAgICAgICAgICAgICAgICAgIGlmIGNvbm4ucmVjdigyKS5kZWNvZGUoIlVURi04IikgPT0gIk9LIjogICMg0JbQtNC10YIg0L/QvtC70YPRh9C10L3QuNGPIE9LCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGZpbGUsICcgdHJhbnNtaXR0ZWQnKSAgIyDQktGL0LLRi9C+0LTQuNGCINGB0L7QvtCx0YnQtdC90LjQtSDQvtCxINC+0LrQvtC90YfQsNC90LjQuCDQv9C10YDQtdC00LDRh9C4INGE0LDQudC70LAKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKCmNvbm4uY2xvc2UoKSAgIyDQl9Cw0LrRgNGL0LLQsNC10YIg0YHQvtC60LXRggpzb2NrLmNsb3NlKCkKCmlucHV0KCdQcmVzcyBFbnRlciB0byBjbG9zZScpCgoK