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