Отправка файлов сокета Python

Python Socket File Transfer Send



Цель этой статьи - узнать как передать текстовый файл по сети через программу Python . Эта передача файлов основана на клиентской модели сервера для использования программирования сокетов в python3 +.

Вот основная схема настройки для запуска этой программы.









Для простоты мы будем называть Систему A как A_client, а Систему B как B_server на протяжении всей статьи.



Требования к файлам:

Нам нужно server.py и этот файл должен присутствовать в серверной системе. В нашем случае server.py должен находиться в системе B_server.





Еще два файла client.py а также sample.txt должен присутствовать в клиентской системе. В нашем случае эти два файла должны присутствовать в системе A_client.

Предположения:

Вот предположения:



  • У нас должны быть две системы Linux с терминальным доступом.
  • Предпочтительный вариант Linux - Ubuntu .
  • Python3 должен быть установлен.
  • Обе системы Linux должны иметь возможность пинговать друг друга. Использовать пинг команда для проверки пинга.
  • Одна система должна действовать как сервер, а другая система должна действовать как клиент в определенное время.

Ограничения:

Прежде чем мы продолжим, мы должны знать, что у этой программы есть некоторые ограничения.

  • Для запуска этой программы должен быть установлен Python3 +. Вы можете наблюдать ошибку или другое поведение при запуске на более старых версиях Python.
  • На данный момент через эту программу можно передавать только текстовые файлы. Любой другой файл формата, не содержащий текста, может не работать.
  • Основные исключения программирования были обработаны в программе.
  • Программа может работать или не работать на других ОС, кроме Ubuntu.
  • Текстовый файл на стороне клиента должен быть коротким, поскольку использовался буфер размером 1024 байта.

Настроить требования:

  • Нам понадобится хотя бы одна система Linux, чтобы опробовать эту программу. Но рекомендуется использовать две разные системы Linux, подключенные через сеть.
  • Две системы должны быть подключены через Ethernet или Wi-Fi или любые другие соединения.

Исходный код сервера:

https://github.com/linuxhintcode/websamples/blob/master/python_send_file/server.py

Исходный код клиента:

https://github.com/linuxhintcode/websamples/blob/master/python_send_file/client.py

Как запускать программы и ожидаемый результат:

Вот шаги для выполнения программы.

Шаг 1: перейдите в систему B_server и откройте терминал. Быстрый путь для открытия терминала: Alt + Ctrl + t.

Шаг 2: Теперь перейдите по пути, где присутствует server.py.

Шаг 3. Теперь запустите server.py, как показано ниже.

сервер python3.ру

Ошибок быть не должно, и вы должны увидеть нижеприведенные распечатки.

Сервер находится в списке на порту: 9898

Имя скопированного файла будет recv.txt на стороне сервера.

Шаг 4: Теперь откройте терминал в системе A_client.

Шаг 5: перейдите по пути, по которому присутствуют client.py и sample.txt.

Шаг 6: Теперь запустите client.py, как показано ниже.

клиент python3.ру <B_server системный IP>

Мы заметили, что нам нужно знать IP-адрес сервера. Мы можем выполнить команду ниже, чтобы узнать IP-адрес системы B_server.

ifconfig

Теперь вывод системы A_client должен быть таким

################## Ниже сообщение получено с сервера ##################
| --------------------------------- |
Привет клиент[IP-адрес: 192.168.1.102],
** Добро пожаловать на сервер **
-Сервер
| --------------------------------- |

Шаг 7: Теперь перейдите на B_server и найдите вывод ниже

Файл успешно скопирован
Сервер прервал соединение

Шаг 8: В папке сервера должен быть один файл с именем recv.txt. Содержимое этого recv.txt должно быть таким же, как sample.txt.

Итак, мы успешно скопировали файл с клиента на сервер по сети с помощью программы Python.

Пояснения к коду:

Есть два файла python server.py а также client.py .

Обратите внимание, что мы объясним один раз, совпадает ли какой-либо код внутри server.py и client.py.

  1. server.py:
#! / usr / bin / env python3

Это строка shebang, которая означает, что по умолчанию этот server.py должен использовать python3. Давайте посмотрим на одно преимущество этой линии.

Мы выполнили server.py или client.py, например python3. Теперь без использования python3 мы можем выполнить файл python. Следуйте нижеприведенным командам

Перейдите в режим суперпользователя:

это

Дайте все разрешения файлу .py:

chmod777сервер.ру

Запустите server.py:

./server.ру Импортировать разъем
Импортразъембиблиотека в программу Pythonв качествеМы собираемся
использоватьразъем длясвязь.

s знак равно разъем.разъем()

Создаем объект s для доступа ко всем методам сокета. Это концепция ООП.

ПОРТзнак равно 9898

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

с.связывать(('',ПОРТ))

Мы используем метод bind для привязки IP-адреса сервера к этому порту [9898]. Одно наблюдение: мы могли бы использовать точный IP-адрес сервера вместо первого аргумента метода привязки, но мы решили оставить поле пустым, так как это работает нормально.

с.связывать((айпи адрес,ПОРТ))
файл знак равно открытым('recv.txt', 'wb')

Мы открыли один файл с именем recv.txt на сервере для режима записи и получили указатель на файл. Это необходимо, так как мы должны скопировать один текстовый файл с клиента.

в то время как Правда:

Давайте запустим один бесконечный цикл while, поскольку задача сервера - ждать, пока клиент свяжется с сервером на этом порту 9898. Итак, этот цикл while необходим.

conn,адресзнак равнос.принимать()

Этот код должен принимать любой входящий запрос на соединение от клиента. Конн будет использовать conn общаться с клиентом и адрес - это IP-адрес клиента, отправившего запрос на переписку на этот сервер через порт 9898.

сообщениезнак равно ' п п| --------------------------------- | пПривет, клиент [IP-адрес:
'
+ адрес[0]+'], п** Добро пожаловать на сервер ** п-Сервер п
| --------------------------------- | п п п'

Этот код предназначен для создания сообщения для отправки клиенту. Это сообщение нужно распечатать на клиентском терминале. Это подтверждает, что клиент может общаться с сервером.

соед.Отправить(сообщениекодировать())

Теперь у нас есть готовое сообщение, и мы отправляем его клиенту, используя этот соед. Этот код фактически отправляет сообщение клиенту.

RecvDataзнак равносоед.получить(1024)

Этот код получает любые данные, отправленные со стороны клиента. В нашем случае мы ожидаем, что содержимое sample.txt будет в RecvData .

в то время какRecvData:

Еще один цикл while с условием RecvData не пустой. В нашем случае он не пустой.

файл.записывать(RecvData)

Как только у нас будет контент внутри RecvData тогда мы пишем в этот файл recv.txt используя указатель файла файл.

RecvDataзнак равносоед.получить(1024)

Снова пытаюсь получить данные от клиента. Один раз RecvData не имеет данных, код прервет цикл while.

файл.близко()

Это просто закроет указатель файла, поскольку мы закончили с записью файла.

соед.близко()

Это закроет соединение с клиентом.

перерыв

Это должно выйти из бесконечного цикла while на B_server.

  1. client.py:
Импортировать sys

Импортируем библиотеку sys, поскольку мы хотим использовать функцию аргумента в python.

если (len(sys.argv) > 1):
ServerIpзнак равно sys.argv[1]
еще:
Распечатать(' п пБеги как пpython3 client.py п п')
выход(1)

Поскольку мы передаем IP-адрес B_server после имени файла client.py во время работы, нам нужно поймать IP-адрес этого сервера внутри клиента.

… ..If (len (sys.argv)> 1): => Чтобы убедиться, что пользователь передает хотя бы один аргумент в качестве IP-адреса, и поймать этот IP-адрес insdie ServerIP.

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

ПОРТзнак равно 9898

Это должен быть тот же порт, который указан на стороне B_server.

с.соединять((ServerIp,ПОРТ))

Этот код будет устанавливать TCP-соединение с IP-адресом сервера с этим портом. Все, что не так с этим понятием, приводит к сбоям в соединении.

файл знак равно открытым('sample.txt', 'rb')

Мы открываем sample.txt в режиме чтения, чтобы читать только контент.

SendDataзнак равно файл.читать(1024)

Чтение содержимого файла и помещение внутрь SendData Переменная.

в то время какSendData:

Мы запускаем один цикл while, если SendData есть данные. В нашем случае, если файл sample.txt не пустой, в нем должны быть данные.

с.Отправить(SendData)

Теперь мы можем отправлять содержимое sample.txt на сервер с помощью объекта сокета с.

SendDataзнак равно файл.читать(1024)

Снова читаю, если что-то осталось. Так что читать из файла будет нечего SendData будет пустым и выйдет из цикла while.

с.близко()

Это не закрытие соединения со стороны клиента.

Скриншоты Ubuntu Серверная сторона

Скриншоты Ubuntu Клиентская сторона

Проверенные комбинации:

  • Linux как сервер и Linux как клиент: PASS
  • Linux как клиент и Linux как сервер: PASS
  • Linux как сервер и Windows10 как клиент: PASS
  • Linux как клиент и Windows10 как сервер: ПРОЙДЕН

Рекомендуется использовать две системы Linux для сервера и клиента.

Ожидаемые ошибки:

  1. Вы можете увидеть ошибку ниже, если сервер не работает на порту 9898.

Отслеживание (последний вызов последний):

Файл'client.py',линия22, в <модуль>
с.соединять((ServerIp,ПОРТ))
ConnectionRefusedError:[Эррно111]В соединении отказано
  1. Ниже отображается ошибка, если IP-адрес не передан на стороне клиента.

Беги как

клиент python3.ру <IP-адрес сервера>
  1. Ниже ошибка видна, если 1уларгумент на стороне клиента не является IP-адресом

Отслеживание (последний вызов последний):

Файл'client.py',линия22, в <модуль>
с.соединять((ServerIp,ПОРТ))
разъем.gaierror:[Эррно -2]Имяилиуслуганетизвестный
  1. Ниже отображается ошибка, если порт используется как 98980.

Отслеживание (последний вызов последний):

Файл'client.py',линия22, в <модуль>
с.соединять((ServerIp,ПОРТ))
OverflowError: getsockaddrarg: порт должен быть0-65535.
  1. Ошибка ниже видна, если на стороне клиента отсутствует файл sample.txt.

Отслеживание (последний вызов последний):

Файл'client.py',линия25, в <модуль>
файл знак равно открытым('sample.txt', 'rb')
FileNotFoundError:[Эррно2]Нет такихфайл иликаталог:'sample.txt'

Заключение:

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