diff --git a/__pycache__/config.cpython-38.pyc b/__pycache__/config.cpython-38.pyc new file mode 100644 index 0000000..eb28586 Binary files /dev/null and b/__pycache__/config.cpython-38.pyc differ 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()