Python

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

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

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

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

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

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

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

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

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

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

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

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

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

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

https: // github.com / linuxhintcode / websamples / blob / master / python_send_file / сервер.ру

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

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

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

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

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

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

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

сервер python3.ру

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

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

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

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

Шаг 5: перейдите по пути, по которому клиент.ру и образец.txt присутствуют.

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

клиент python3.ру

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

ifconfig

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

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

Шаг 7: Теперь перейдите на B_server и найдите результат ниже

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

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

Итак, мы успешно скопировали файл с клиента на сервер по сети через программу python.

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

Есть два файла python сервер.ру а также клиент.ру.

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

  1. сервер.ру:
#!/ usr / bin / env python3

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

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

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

вс

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

chmod 777 сервер.ру

Запустить сервер.ру:

./ сервер.py импортный сокет
Импортируем библиотеку сокетов в программу Python по мере продвижения
использовать сокет для подключения.
s = розетка.разъем()

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

ПОРТ = 9898

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

s.bind ((", ПОРТ))

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

s.bind ((IP-адрес, ПОРТ))
file = open ("recv.txt "," wb ")

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

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

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

conn, addr = s.принимать()

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

msg = "\ n \ n | --------------------------------- | \ n Высокий клиент [IP-адрес:
"+ addr [0] +"], \ n ** Добро пожаловать на сервер ** \ n -Сервер \ n
| --------------------------------- | \ n \ n \ n "

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

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

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

RecvData = conn.recv (1024)

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

а RecvData:

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

файл.написать (RecvData)

Как только у нас будет контент внутри «RecvData» затем мы пишем в этот файл «Recv.текст" используя указатель файла "файл".

RecvData = conn.recv (1024)

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

файл.Закрыть()

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

conn.Закрыть()

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

перерыв

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

  1. клиент.ру:
import sys

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

если (len (sys.argv)> 1):
ServerIp = sys.argv [1]
еще:
print ("\ n \ n Запускать как \ n клиент python3.ру < serverip address > \ n \ n ")
выход (1)

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

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

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

ПОРТ = 9898

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

s.подключить ((ServerIp, ПОРТ))

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

file = open ("образец.txt "," rb ")

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

SendData = файл.читать (1024)

Чтение содержимого файла и установка внутри «SendData » Переменная.

а SendData:

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

s.отправить (SendData)

Теперь мы можем отправлять содержимое "образец.текст" на сервер с помощью объекта сокета «С».

SendData = файл.читать (1024)

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

s.Закрыть()

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

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

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

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

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

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

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

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

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

Файловый "клиент".ру », строка 22, в
s.подключить ((ServerIp, ПОРТ))
ConnectionRefusedError: [Errno 111] В соединении отказано
  1. Ниже отображается ошибка, если IP-адрес не передан на стороне клиента

Беги как

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

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

Файловый "клиент".ру », строка 22, в
s.подключить ((ServerIp, ПОРТ))
разъем.gaierror: [Errno -2] Имя или услуга неизвестны
  1. Ниже отображается ошибка, если порт используется как 98980

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

Файловый "клиент".ру », строка 22, в
s.подключить ((ServerIp, ПОРТ))
OverflowError: getsockaddrarg: порт должен быть 0-65535.
  1. Ошибка отображается, если «образец.txt »отсутствует на стороне клиента.

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

Файловый "клиент".ру », строка 25, в
file = open ("образец.txt "," rb ")
FileNotFoundError: [Errno 2] Нет такого файла или каталога: 'образец.текст'

Заключение:

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

Лучшие дистрибутивы Linux для игр в 2021 году
Операционная система Linux прошла долгий путь от своего первоначального простого серверного вида. Эта ОС значительно улучшилась за последние годы и те...
Как записать и транслировать игровую сессию в Linux
В прошлом игры считались только хобби, но со временем игровая индустрия увидела огромный рост с точки зрения технологий и количества игроков. Игровая ...
Лучшие игры с отслеживанием рук
Oculus Quest недавно представил отличную идею отслеживания рук без контроллеров. С постоянно растущим числом игр и действий, которые осуществляются фо...