Python передать файл по сети

Обновлено: 06.07.2024

В этом руководстве мы рассмотрим, как использовать FTP с Python для отправки и получения файлов с сервера через соединения TCP / IP .

Чтобы упростить задачу и сделать ее более абстрактной, мы будем использовать библиотеку Python ftplib, которая предоставляет ряд функций, облегчающих работу с FTP. Мы увидим реализацию для загрузки и выгрузки файлов с сервера, а также некоторые другие интересные вещи, которые позволяет нам делать ftplib.

Что такое FTP?

FTP обозначает протокол передачи файлов; он основан на архитектуре модели клиент-сервер и широко используется. Имеет два канала; командный канал и канал данных. Командный канал используется для управления связью, а канал данных используется для фактической передачи файлов. С помощью FTP вы можете делать множество вещей, таких как перемещение, загрузка, копирование файлов и т.д. Мы обсудим это в следующем разделе, а также подробно расскажем, как это сделать с помощью Python.

Работа с FTP в Python

Двигаясь дальше, вы будете рады узнать, что ftplib это встроенная библиотека, которая уже установлена ​​с Python, все, что вам нужно сделать, это импортировать ее в свой скрипт и вы можете начать использовать ее функции. Чтобы импортировать его, используйте следующую команду:

После этого нам нужно установить соединение с FTP-сервером, с которым мы хотим открыть канал связи. Для этого создайте экземпляр ftp :

Вышеуказанный метод использует порт по умолчанию, то есть порт 21, для установления соединения с сервером. Следующим шагом является предоставление учетных данных для входа в систему, то есть вашего имени пользователя и пароля, чтобы получить доступ к файлам на сервере. Для этого вы можете использовать следующий метод:

Теперь, когда мы установили соединение с сервером, мы хотим перейти к каталогу, в котором мы хотим выполнить операции, т.е. получить или записать файл. Для этого мы изменим «текущий рабочий каталог», используя следующую команду:

Давайте теперь обсудим некоторые основные примеры того, как получить файл из каталога или записать файл в каталог. Объяснение кода предоставляется в комментариях рядом с каждой строкой кода:

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

Есть еще одна вещь, которую вам нужно сделать после загрузки или отправке файла - закройте этот файл, а также закройте открытое вами соединение FTP. Вы можете сделать это для приведенного выше примера с помощью следующих двух строк кода:

Давайте теперь попробуем загрузить файл на сервер. В дополнение к приведенным ниже командам вам также придется переписать команды, которые мы использовали выше, чтобы открыть FTP-соединение.

В приведенных выше примерах «rb» и «wb» означают «чтение двоичного файла» и «запись двоичного файла» соответственно.

Дополнительные функции FTP

Теперь, когда мы обсудили реализацию основных функций, давайте рассмотрим некоторые дополнительные функции, которые предоставляет нам ftplib .

Список файлов и каталогов

Чтобы просмотреть файлы и папки в текущем рабочем каталоге, в виде списка, выполните команду retrlines :

Создать новый каталог

Чтобы организовать ваши файлы определенным образом, вам может потребоваться создать новый каталог на сервере, что можно сделать с помощью одной строки кода:

Путь будет тем местом, в котором вы хотите разместить новый каталог.

Удалить файл с сервера

Проверить текущий путь

Чтобы проверить текущий путь, просто запустите следующий код:

Эта команда вернет абсолютный путь к текущему рабочему каталогу.

Важно отметить, что, хотя FTP сам по себе достаточно безопасен, он обычно не используется для передачи конфиденциальной информации; если вы передаете что-то подобное, вам следует использовать более безопасные опции, такие как SFTP (Secure FTP) или SSH (Secure Shell). Это наиболее часто используемые протоколы для обработки конфиденциальных данных.

Заключение

В этом посте мы обсудили, что такое FTP и как он работает, с помощью различных примеров. Мы также увидели, как использовать модуль Python «ftplib» для связи с удаленным сервером по FTP, и увидели некоторые другие функции, которые предлагает этот модуль. В конце мы также обсудили некоторые более безопасные альтернативы FTP, такие как SFTP и SSH, которые используются для передачи конфиденциальной информации.

Для получения дополнительной информации об использовании FTP с Python см. Официальную документацию по ftplib или RFC 959 .

Протокол

TCP используют, чтобы формировать между компьютерами двусторонний канал обмена данными. Благодаря TCP пакеты гарантированно доставляются с соблюдением порядка их очередности, с автоматическим разбиением данных на пакеты и контролем их передачи. В то же время TCP работает медленно, так как потерянные пакеты многократно повторно отправляются, а операций, выполняемых над пакетами, слишком много.

Протокол UDP — низкоуровневый. С его помощью компьютеры могут отправлять и получать информацию в виде отдельных пакетов, не создавая логическое соединение. В отличие от TCP, взаимодействия по протоколу UDP не отличаются надежностью. Это усложняет управление ими в приложениях, в которых при обмене информацией нужны гарантии. Поэтому большинство интернет-приложений используют TCP.


Работа с сокетами в Python

Для создания сокетов в питоне используется модуль socket. В нем так же имеются методы для , установление и закрытие соединения, отправку данных по сети и их получение и другие операции.

ОбщиеСерверныеКлиентские
socket — создать сокетbind — привязать сокет к IP-адресу и порту машиныconnect — установить соединение
send — передать данныеlisten — просигнализировать о готовности принимать соединения
recv — получить данныеaccept — принять запрос на установку соединения
close — закрыть соединение

Работа ТСР протокола

Чтобы понять, как с сокетом работает протокол ТСР, посмотрим на изображение ниже. Пояснение будет в коде программы (для примера мы отправляем клиенту текущее время)


Серверная часть:

Если вы работаете в среде программирования, то разрешите вашему серверу работать в вашей локальной сети:


Клиентская часть

from socket import *

Результат клиентской части (после запуска сервера):


Результат серверной части (после подключения клиента):

Как происходит кодирование/декодирование данных?

Строки, байты, изменяемые строки байтов:

from socket import *
import time

JSON Instant Messaging

Весь скомпилированный JSON-объект должен уложиться в 640 символов.

Аутентификация

Для того, чтобы инициализировать процесс аутентификации, надо создать такой JSON-объект:

Ответы сервера будут содержать поле response, и может быть еще одно (необязательное) поле alert/error с текстом ошибки.

Подключение, отключение, авторизация

В сети/ не в сети

В свою очередь, сервер посылает специальный probe-запрос для проверки доступности клиента:

Алерты и ошибки сервера

Тоже самое, что и отправка обычному пользователю, только в поле to ставится решетка с названием чатрума

Модуль socket обеспечивает доступ к интерфейсу сокета BSD. Он доступен во всех современных системах Unix, Windows, MacOS и, возможно, на дополнительных платформах.

Он включает в себя функции создания объекта сокета Socket , который и обрабатывает канал данных, а также функции, связанных с сетевыми задачами, такими как преобразование имени сервера в IP адрес и форматирование данных для отправки по сети.

Примечание. Поведение модуля может зависеть от платформы, поскольку выполняются вызовы API сокетов операционной системы.

Интерфейс Python представляет собой прямую трансляцию системного вызова Unix и интерфейса библиотеки для сокетов в объектно-ориентированный стиль Python. Функция socket.socket() возвращает объект Socket , методы которого реализуют различные системные вызовы сокетов.

Типы параметров функций модуля несколько более высокоуровневые, чем в интерфейсе языка C: как и в случае операций чтения/записи с файлами, распределение буфера при операциях приема данных происходит автоматически, а длина буфера неявно определяется операциями отправки.

Пример создания и использования сокетов на примере TCP/IP сервер и клиента.

Примечание. Для успешного тестирования примера, код клиента и сервера необходимо запускать в разных окнах терминала. Код сервера запускается первым.

TCP/IP сервер.

Вызов метода sock.listen(1) переводит сокет в режим сервера, а метод sock.accept() ожидает входящего соединения. Целочисленный аргумент у метода .listen - это количество соединений, которые система должна поставить в очередь в фоновом режиме, прежде чем отклонять новых клиентов. В этом примере предполагается, что одновременно будет работать только одно соединение.

Метод sock.accept() возвращает открытое соединение между сервером и клиентом вместе с адресом клиента. На самом деле соединение представляет собой другой сокет на другом порту (назначенный ядром). Данные считываются из соединения с помощью метод sock.recv() и передаются с помощью sock.sendall() .

Когда общение с клиентом завершено, соединение необходимо очистить с помощью sock.close() . В этом примере используется блок try/finally , чтобы гарантировать, что метод sock.close() всегда вызывается, даже в случае ошибки.

Клиентская программа настраивает свой сокет иначе, чем сервер. Вместо привязки к порту и прослушивания он использует метод sock.connect() для подключения сокета непосредственно к удаленному адресу.

TCP/IP клиент.

Работа клиента и сервера вместе.

Клиент и сервер должны запускаться в отдельных окнах терминала, чтобы они могли взаимодействовать друг с другом. Выходные данные сервера показывают входящее соединение и данные, а также ответ, отправленный обратно клиенту.

Модуль socket обеспечивает доступ к интерфейсу сокета BSD. Он доступен во всех современных системах Unix, Windows, MacOS и, возможно, на дополнительных платформах.

Он включает в себя функции создания объекта сокета Socket , который и обрабатывает канал данных, а также функции, связанных с сетевыми задачами, такими как преобразование имени сервера в IP адрес и форматирование данных для отправки по сети.

Примечание. Поведение модуля может зависеть от платформы, поскольку выполняются вызовы API сокетов операционной системы.

Интерфейс Python представляет собой прямую трансляцию системного вызова Unix и интерфейса библиотеки для сокетов в объектно-ориентированный стиль Python. Функция socket.socket() возвращает объект Socket , методы которого реализуют различные системные вызовы сокетов.

Типы параметров функций модуля несколько более высокоуровневые, чем в интерфейсе языка C: как и в случае операций чтения/записи с файлами, распределение буфера при операциях приема данных происходит автоматически, а длина буфера неявно определяется операциями отправки.

Пример создания и использования сокетов на примере TCP/IP сервер и клиента.

Примечание. Для успешного тестирования примера, код клиента и сервера необходимо запускать в разных окнах терминала. Код сервера запускается первым.

TCP/IP сервер.

Вызов метода sock.listen(1) переводит сокет в режим сервера, а метод sock.accept() ожидает входящего соединения. Целочисленный аргумент у метода .listen - это количество соединений, которые система должна поставить в очередь в фоновом режиме, прежде чем отклонять новых клиентов. В этом примере предполагается, что одновременно будет работать только одно соединение.

Метод sock.accept() возвращает открытое соединение между сервером и клиентом вместе с адресом клиента. На самом деле соединение представляет собой другой сокет на другом порту (назначенный ядром). Данные считываются из соединения с помощью метод sock.recv() и передаются с помощью sock.sendall() .

Когда общение с клиентом завершено, соединение необходимо очистить с помощью sock.close() . В этом примере используется блок try/finally , чтобы гарантировать, что метод sock.close() всегда вызывается, даже в случае ошибки.

Клиентская программа настраивает свой сокет иначе, чем сервер. Вместо привязки к порту и прослушивания он использует метод sock.connect() для подключения сокета непосредственно к удаленному адресу.

TCP/IP клиент.

Работа клиента и сервера вместе.

Клиент и сервер должны запускаться в отдельных окнах терминала, чтобы они могли взаимодействовать друг с другом. Выходные данные сервера показывают входящее соединение и данные, а также ответ, отправленный обратно клиенту.

Читайте также: