Схема базовой настройки:
Вот основная схема настройки для запуска этой программы.
Для простоты мы будем называть Систему A как A_client и Систему B как B_server на протяжении всей статьи.
Требования к файлам:
Нам нужно сервер.ру и этот файл должен присутствовать в серверной системе. В нашем случае сервер.py должен быть в системе B_server.
Еще два файла клиент.ру а также образец.текст должен присутствовать в клиентской системе. В нашем случае эти два файла должны присутствовать в системе 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 / сервер.ру
Исходный код клиента:
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 сервер.ру а также клиент.ру.
Обратите внимание, что мы объясним один раз, если какой-либо код внутри сервера такой же.ру и клиент.ру.
- сервер.ру:
Это строка 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.
- клиент.ру:
Импорт библиотеки 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 для сервера и клиента.
Ожидаемые ошибки:
- Вы можете увидеть ошибку ниже, если сервер не работает на порту 9898
Отслеживание (последний вызов последний):
Файловый "клиент".ру », строка 22, вs.подключить ((ServerIp, ПОРТ))
ConnectionRefusedError: [Errno 111] В соединении отказано
- Ниже отображается ошибка, если IP-адрес не передан на стороне клиента
Беги как
клиент python3.ру < serverip address >- Ниже ошибка видна, если 1ул аргумент на стороне клиента не является IP-адресом
Отслеживание (последний вызов последний):
Файловый "клиент".ру », строка 22, вs.подключить ((ServerIp, ПОРТ))
разъем.gaierror: [Errno -2] Имя или услуга неизвестны
- Ниже отображается ошибка, если порт используется как 98980
Отслеживание (последний вызов последний):
Файловый "клиент".ру », строка 22, вs.подключить ((ServerIp, ПОРТ))
OverflowError: getsockaddrarg: порт должен быть 0-65535.
- Ошибка отображается, если «образец.txt »отсутствует на стороне клиента.
Отслеживание (последний вызов последний):
Файловый "клиент".ру », строка 25, вfile = open ("образец.txt "," rb ")
FileNotFoundError: [Errno 2] Нет такого файла или каталога: 'образец.текст'
Заключение:
Используя эту программу, мы можем отправить простой текстовый файл из одной системы в другую через сеть, используя программу Python. Это дает нам базовое обучение программированию на Python и сокетах, а также для отправки данных по сети.