Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added __pycache__/config.cpython-38.pyc
Binary file not shown.
15 changes: 15 additions & 0 deletions config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
HOST_ADDR = 'localhost'
PORT = 9108
INTERRUPT_MESSAGE = 'interrupting connection...'
HELP = '''
pwd - показывает название рабочей директории
ls - показывает содержимое текущей директории
cat <filename> - отправляет содержимое файла
mkdir <dirname> - создает папку с именем <dirname>
rmdir <dirname> - удаляет папку с именем <dirname>
rmfile <filename> - удаляет файл с именем <filename>
mv <source> <destination> - переименовывает файл
touch <filename> [Text] - создает файл с именем <filename> с текстом Text, если он указан
getfile <filename> - загружает файл filename с сервера
sendfile <filename> - отправляет файл filename на сервер
'''
3 changes: 2 additions & 1 deletion docs/1.txt
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
Hello!
Hello! Hello! Hello! Hello!
Hello! Hello!
1 change: 1 addition & 0 deletions docs/client/client.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Hello, i'm file from client
1 change: 1 addition & 0 deletions docs/server/server.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This is server file
37 changes: 28 additions & 9 deletions ftp-client.py
Original file line number Diff line number Diff line change
@@ -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()
116 changes: 104 additions & 12 deletions ftp-server.py
Original file line number Diff line number Diff line change
@@ -1,35 +1,127 @@
import socket
import os
'''
pwd - показывает название рабочей директории
ls - показывает содержимое текущей директории
cat <filename> - отправляет содержимое файла
'''
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()