From 2cdf687435066db7ce67258738069fa648037a3f Mon Sep 17 00:00:00 2001 From: Kirill <202536@edu.fa.ru> Date: Tue, 14 Dec 2021 23:21:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D0=BE?= =?UTF-8?q?=D0=B5=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/config.cpython-38.pyc | Bin 0 -> 1067 bytes config.py | 15 ++++ docs/1.txt | 3 +- docs/client/client.txt | 1 + docs/server/server.txt | 1 + ftp-client.py | 37 +++++++--- ftp-server.py | 116 ++++++++++++++++++++++++++---- 7 files changed, 151 insertions(+), 22 deletions(-) create mode 100644 __pycache__/config.cpython-38.pyc create mode 100644 config.py create mode 100644 docs/client/client.txt create mode 100644 docs/server/server.txt diff --git a/__pycache__/config.cpython-38.pyc b/__pycache__/config.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb2858636c87ac6e084469935feadb460399d6c3 GIT binary patch literal 1067 zcma)5%Wl&^6m=SdsHHBDSRoc8v8n{|id|Gu(Lj+(6D97(2t|=SO|1G+`B4fBlm`eQ z7Hs$cw(LTvTeoSFU%0c)mTzFkf;-bVq$EYy^3BX-=FB`<2w*WF_eb zpUgfPoIJ!YxP`%#bji%<8FNWrGP8Qtlq=HeHGSFkjGEo>g3$VWSCU@ew%m~VezYH2 zZk-sO>rx}MJU5riMR)KLW&fo~?h_cn5YC_rC+s8i@Hb{{0t3DvrUOVICaj4I-(bkz zLky<`jv&FM7|vK57n`^zQS9I7#-rf$ul zYaD)v$3}up5BltrV7nOpEiyiZK6Djl&$N7!$B@E^6DLS%B6oy?5sK*$)*^yoj26Uj z{^yk9J98)ZB}Dc_>?#3u%>`f!t0lE}3dgIRYv%PS z0F~`kdAz(?tZ3Esjg9hHE)~n#_~z4XtxzuSl(g!zLZ!0)q@c^2g{{(8$(OM$Mfmv$ zM{2`!sJdtQmTjx>1!Y`xPJ*4oF6`;6Tb3Ig7Axw5>SL``4XA%WeHFWO*Q)3CUyX0% S9nXwxy2e{SxQ;>2@b@>T?Hri^ literal 0 HcmV?d00001 diff --git a/config.py b/config.py new file mode 100644 index 0000000..8f1d87d --- /dev/null +++ b/config.py @@ -0,0 +1,15 @@ +HOST_ADDR = 'localhost' +PORT = 9108 +INTERRUPT_MESSAGE = 'interrupting connection...' +HELP = ''' +pwd - показывает название рабочей директории +ls - показывает содержимое текущей директории +cat - отправляет содержимое файла +mkdir - создает папку с именем +rmdir - удаляет папку с именем +rmfile - удаляет файл с именем +mv - переименовывает файл +touch [Text] - создает файл с именем с текстом Text, если он указан +getfile - загружает файл filename с сервера +sendfile - отправляет файл filename на сервер +''' \ No newline at end of file diff --git a/docs/1.txt b/docs/1.txt index 05a682b..2f0493e 100644 --- a/docs/1.txt +++ b/docs/1.txt @@ -1 +1,2 @@ -Hello! \ No newline at end of file +Hello! Hello! Hello! Hello! +Hello! Hello! \ No newline at end of file diff --git a/docs/client/client.txt b/docs/client/client.txt new file mode 100644 index 0000000..4102005 --- /dev/null +++ b/docs/client/client.txt @@ -0,0 +1 @@ +Hello, i'm file from client \ No newline at end of file diff --git a/docs/server/server.txt b/docs/server/server.txt new file mode 100644 index 0000000..38f8041 --- /dev/null +++ b/docs/server/server.txt @@ -0,0 +1 @@ +This is server file \ No newline at end of file diff --git a/ftp-client.py b/ftp-client.py index 3339519..f73c91b 100644 --- a/ftp-client.py +++ b/ftp-client.py @@ -1,17 +1,36 @@ import socket - -HOST = 'localhost' -PORT = 6666 +import config +import os while True: request = input('>') - sock = socket.socket() - sock.connect((HOST, PORT)) - - sock.send(request.encode()) - + sock.connect((config.HOST_ADDR, config.PORT)) + + if request.split()[0] == 'sendfile': + filename = request.split()[1] + sock.send(f"getfile {filename} ".encode()) + with open(os.path.join('docs', 'client', filename), 'rb') as f: + while True: + bytes_read = f.read(1024) + sock.send(bytes_read) + if len(bytes_read) < 1024: + break + elif request.split()[0] == 'getfile': + filename = request.split()[1] + sock.send(f"sendfile {filename}".encode()) + with open(os.path.join('docs', 'client', filename), 'wb') as f: + while True: + bytes_read = sock.recv(1024) + f.write(bytes_read) + if len(bytes_read) < 1024: + break + else: + sock.send(request.encode()) response = sock.recv(1024).decode() print(response) - + if response == config.INTERRUPT_MESSAGE: + sock.close() + break + sock.close() \ No newline at end of file diff --git a/ftp-server.py b/ftp-server.py index bdb4f38..2058399 100644 --- a/ftp-server.py +++ b/ftp-server.py @@ -1,35 +1,127 @@ import socket import os -''' -pwd - показывает название рабочей директории -ls - показывает содержимое текущей директории -cat - отправляет содержимое файла -''' +import config +import shutil dirname = os.path.join(os.getcwd(), 'docs') + def process(req): if req == 'pwd': return dirname elif req == 'ls': return '; '.join(os.listdir(dirname)) + elif 'cat' in req.split(): + return cat(req.split(' ')[1]) + elif 'mkdir' in req.split(): + return mkdir(req) + elif 'rmdir' in req.split(): + return rmdir(req) + elif 'rmfile' in req.split(): + return rmfile(req) + elif 'mv' in req.split(): + return mv(req) + elif 'touch' in req.split(): + return touch(req) + elif req == 'help': + return config.HELP return 'bad request' -PORT = 6666 +def cat(filename): + with open(os.path.join(dirname, filename), 'r') as f: + return ''.join(f.readlines()) + + +def touch(req): + if len(req.split()) == 2: + filename, text = req.split()[1], '' + else: + filename, text = req.split()[1], ' '.join(req.split()[2:]) + try: + with open(os.path.join(dirname, filename), 'w') as f: + f.write(text) + return f"File '{filename}' created" + except Exception as e: + return f"File '{filename}' not created: {e}" + + +def mv(req): + source, destination = req.split()[1:3] + try: + os.rename(os.path.join(dirname, source), os.path.join(dirname, destination)) + return f"'{source}' changed to '{destination}'" + except Exception as e: + return f"not renamed: {e}" + + +def rmdir(req): + dir = req.split()[1] + try: + shutil.rmtree(os.path.join(dirname, dir)) + return f"Directory '{dir}' removed" + except Exception as e: + return f"'dir' not removed: {e}" + + +def rmfile(req): + filename = req.split()[1] + try: + os.remove(os.path.join(dirname, filename)) + return f"File '{filename}' deleted" + except Exception as e: + return f"File '{filename}' not deleted" + + +def mkdir(req): + try: + new_dir = req.split()[1] + os.mkdir(os.path.join(dirname, new_dir)) + return f"Created directory '{new_dir}'" + except FileExistsError as e: + return f"'{new_dir}' already exists" + sock = socket.socket() -sock.bind(('', PORT)) +sock.bind(('', config.PORT)) sock.listen() -print("Прослушиваем порт", PORT) +print("Прослушиваем порт", config.PORT) while True: conn, addr = sock.accept() request = conn.recv(1024).decode() print(request) - - response = process(request) - conn.send(response.encode()) - + if request == 'exit': + conn.send(config.INTERRUPT_MESSAGE.encode()) + break + if request.split()[0] == 'getfile': + filename = request.split()[1] + bytes_read = ' '.join(request.split()[2:]).encode() + try: + with open(os.path.join('docs', 'server', filename), 'wb') as f: + while True: + print(bytes_read) + f.write(bytes_read) + if len(bytes_read) < 1024: + break + bytes_read = conn.recv(1024) + conn.send(f"File '{filename}' received".encode()) + except Exception as e: + conn.send(f"File '{filename}' transfer error: {e}".encode()) + elif request.split()[0] == 'sendfile': + filename = request.split()[1] + try: + with open(os.path.join('docs', 'server', filename), 'rb') as f: + while True: + bytes_read = f.read(1024) + if not bytes_read: + break + conn.send(bytes_read) + conn.send(f"File '{filename}' sent".encode()) + except Exception as e: + conn.send(f"File '{filename}' transfer error: {e}".encode()) + else: + response = process(request) + conn.send(response.encode()) conn.close()