В этой статье мы реализуем известный протокол в компьютерных сетях, называемых File Transfer Protocol (FTP) using Python. Мы используем гнездо TCP для этого, то есть, ориентированное на соединение сокет. FTP (File Transfer Protocol) Является сетевым протоколом для передачи файлов между компьютерами по протоколу управления передачей/Интернет -протокол (TCP/IP) соединения.FTP обычно используется для передачи файлов за кулисами для других приложений, таких как банковские услуги.
Предварительные знания: лаба 1
File Structure
Мы начинаем с импорта библиотеки сокетов и изготовления простого розетки. AF_INET Относится к адресу адреса IPv4.А SOCK_STREAM означает, ориентированный на соединение протокол TCP.После этого мы связываем адрес хоста и номер порта с сервером.
Пользователь входит в максимальное количество клиентских подключений, необходимых. На основе ввода мы определяем размер хранения клиентов, которые придерживаются подключения .Это происходит до тех пор, пока массив соединений не достигнет своего максимального предела.Затем для каждого соединения начинается обработка,
- Данные получены, а затем декодируются.
- Если данные не являются нулевыми, сервер создает файл с именем «output.txt» и записывает его в него.
- Это продолжается до тех пор, пока все данные не будут записаны в файл
- Выше приведено для всех клиентов, а затем соединения закрыты.Следовательно, мы можем получить новый файл на конце сервера с одинаковыми данными.
import socket
if __name__ == '__main__':
# Defining Socket
host = '127.0.0.1'
port = 8080
totalclient = int(input('Enter number of clients: '))
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((host, port))
sock.listen(totalclient)
# Establishing Connections
connections = []
print('Initiating clients')
for i in range(totalclient):
conn = sock.accept()
connections.append(conn)
print('Connected with client', i+1)
fileno = 0
idx = 0
for conn in connections:
# Receiving File Data
idx += 1
data = conn[0].recv(1024).decode()
if not data:
continue
# Creating a new file at server end and writing the data
filename = 'output'+str(fileno)+'.txt'
fileno = fileno+1
fo = open(filename, "w")
while data:
if not data:
break
else:
fo.write(data)
data = conn[0].recv(1024).decode()
print()
print('Receiving file from client', idx)
print()
print('Received successfully! New filename is:', filename)
fo.close()
# Closing all Connections
for conn in connections:
conn[0].close()
Сначала мы создаем сокет для клиента и подключаем его к серверу, используя кортеж, содержащий адрес хоста и номер порта.Затем пользователь вводит имя файла, которое он хочет отправить на сервер.После этого, используя функцию open () Python, данные файла читаются.Данные считываются по строке по строке, а затем кодируются в двоичном файле и отправляются на сервер, используя socket.send (). При завершении отправки данных файл закрыт.Он продолжает запрашивать имя файла у пользователя, пока подключение клиента не будет прекращено.
import socket
# Creating Client Socket
if __name__ == '__main__':
host = '127.0.0.1'
port = 8080
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Connecting with Server
sock.connect((host, port))
while True:
filename = input('Input filename you want to send: ')
try:
# Reading file and sending data to server
fi = open(filename, "r")
data = fi.read()
if not data:
break
while data:
sock.send(str(data).encode())
data = fi.read()
# File is closed after data is sent
fi.close()
except IOError:
print('You entered an invalid filename!\
Please enter a valid name')
Итог:
Теперь мы запускаем сервер, используя команду.
python tcp-server.py
Вывод на стороне сервера
После этого мы указываем максимальное количество возможных клиентских соединений (скажем, 2).
-
Clients’ connections are initialized, то есть массив соединений генерируется размером 2 для хранения клиентов.
-
После этого мы создаем новый терминал и запускаем нашего клиента, используя команду.
python tcp-client.py
Максимальное количество вкладок, где мы можем запустить команду в терминале.Таким образом, мы создаем двух клиентов клиента 1 и клиент 2.
Вывод на стороне клиента
Как только клиент запускается, мы видим вывод «подключен с клиентом 1» на стороне сервера, указывая, что соединение успешно завершено с первым клиентом.То же самое для второго клиента. После этого, на стороне клиента, мы даем имя файла, которое хотим отправить.Здесь file1.txt отправляется обоими клиентами.Содержание file1.txt показано ниже:
Файл отправлен на сервер
Обратите внимание, что на стороне клиента мы продолжаем показывать подсказку: “Input filename you want to send:” так что клиент может отправлять несколько файлов.Как только соединение с клиентом отключено, используя «Control+C» в терминале, новый файл с именем output.txt сгенерирован на стороне сервера с тем же контентом, и соединение закрыто.Здесь файл клиента 1 хранится как Output0.txt, и файл клиента 2 хранится как Ouput1.txt.
Файл, полученный от клиента 1
Файл, полученный от клиента 2
Если непонятно, есть видюшка