Отправка файлов

Последнее обновление: 03.05.2023

Довольно часто в клиент-серверных приложениях встречается задача отправки и получения файлов. Рассмотрим, как это сделать. Допустим, у нас есть файл hello.txt с простейшим содержимым:

hello world
hello test

Для отправки файла определим в файле server.py следующий код сервера:

import socket

server = socket.socket()            # создаем объект сокета сервера
hostname = socket.gethostname()     # получаем имя хоста локальной машины
port = 12345                        # устанавливаем порт сервера
server.bind((hostname, port))       # привязываем сокет сервера к хосту и порту
server.listen(5)                    # начинаем прослушиваение входящих подключений

print("Server running")

con, _ = server.accept()        # принимаем клиента
filename="hello.txt"            # имя файла для отправки
file = open(filename, "rb")     # открываем файл для отправки
print("sending data to client")
# считываем данные из файла блоками по 1024 байт и отправляем клиенту
line = file.read(1024)
while(line):
    con.send(line)      # отправляем строку клиенту 
    line = file.read(1024)  
    
file.close()            # закрываем файл
con.close()             # закрываем клиента
server.close()

Здесь открываем файл в бинарном режиме, считываем его блоками по 1024 файла и в цикле отправляем клиенту, пока не считаем и не отправим все данные из файла.

Для получения файла в файле client.py определим следующий код клиента:

import socket

client = socket.socket()            # создаем сокет клиента
hostname = socket.gethostname()     # получаем хост локальной машины
port = 12345                        # устанавливаем порт сервера
client.connect((hostname, port))    # подключаемся к серверу

print("receiving data from server")
while True:
    data = client.recv(1024)    # получаем данные от сервера
    print(bytes.decode(data))
    if not data: break

client.close()

Здесь в бесконечном цикле получаем от сервера данные блоками по 1024 байта и выводим их на консоль. Когда данных больше не будет, выходим из цикла.

Запустим сервер и затем клиент. Консоль сервера отобразит следующее:

c:\python>python server.py
Server running
sending data to client

А консоль клиента получит данные файла и выведет их на консоль:

c:\python>python client.py
receiving data from server
hello world
hello test

Мы можем пойти дальше и вместо вывода полученного содержимого файла на консоль сохранять файл на клиенте:

import socket

client = socket.socket()            # создаем сокет клиента
hostname = socket.gethostname()     # получаем хост локальной машины
port = 12345                        # устанавливаем порт сервера
client.connect((hostname, port))    # подключаемся к серверу

file = open("test.txt", "wb")
print("receiving data from server")
while True:
    data = client.recv(1024)    # получаем данные от сервера
    file.write(data)            # записываем данные в файл
    if not data: break
file.close()    # закрываем файл
print("data saved")
client.close()

В данном случае полученные данные сохраняются в файл "test.txt", который будет создаваться в одной папке со скриптом клиента.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850