Довольно часто в клиент-серверных приложениях встречается задача отправки и получения файлов. Рассмотрим, как это сделать. Допустим, у нас есть файл 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", который будет создаваться в одной папке со скриптом клиента.