Как сделать свой протокол передачи данных python

Добавил пользователь Валентин П.
Обновлено: 04.10.2024

Python предоставляет два уровня доступа к сетевым сервисам. На низком уровне вы можете получить доступ к базовой поддержке сокетов в базовой операционной системе, которая позволяет реализовывать клиенты и серверы как для протоколов, ориентированных на соединение, так и для протоколов без установления соединения.

Эта глава дает вам понимание самой известной концепции в сети — Socket Programming.

Что такое сокеты?

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

Сокеты могут быть реализованы для нескольких различных типов каналов: доменные сокеты Unix, TCP, UDP и т. Д. Библиотека сокетов предоставляет специальные классы для обработки общих транспортов, а также универсальный интерфейс для обработки остальных.

Сокеты имеют свой собственный словарь —

Семейство протоколов, которое используется в качестве транспортного механизма. Эти значения являются константами, такими как AF_INET, PF_INET, PF_UNIX, PF_X25 и т. Д.

Тип связи между двумя конечными точками, обычно SOCK_STREAM для протоколов, ориентированных на соединение, и SOCK_DGRAM для протоколов без установления соединения.

Обычно ноль, это может использоваться для идентификации варианта протокола в домене и типе.

Идентификатор сетевого интерфейса —

Строка, которая может быть именем хоста, четырехточечным адресом или IPV6-адресом в двоеточии (и, возможно, точечной) нотации.

Строка нулевой длины, которая указывает INADDR_ANY, или

Целое число, интерпретируемое как двоичный адрес в порядке байтов хоста.

Каждый сервер прослушивает клиентов, звонящих на один или несколько портов. Порт может быть номером порта Fixnum, строкой с номером порта или названием службы.

Семейство протоколов, которое используется в качестве транспортного механизма. Эти значения являются константами, такими как AF_INET, PF_INET, PF_UNIX, PF_X25 и т. Д.

Тип связи между двумя конечными точками, обычно SOCK_STREAM для протоколов, ориентированных на соединение, и SOCK_DGRAM для протоколов без установления соединения.

Обычно ноль, это может использоваться для идентификации варианта протокола в домене и типе.

Идентификатор сетевого интерфейса —

Строка, которая может быть именем хоста, четырехточечным адресом или IPV6-адресом в двоеточии (и, возможно, точечной) нотации.

Строка нулевой длины, которая указывает INADDR_ANY, или

Целое число, интерпретируемое как двоичный адрес в порядке байтов хоста.

Каждый сервер прослушивает клиентов, звонящих на один или несколько портов. Порт может быть номером порта Fixnum, строкой с номером порта или названием службы.

Модуль розетки

Чтобы создать сокет, вы должны использовать функцию socket.socket (), доступную в модуле сокета, который имеет общий синтаксис —

Вот описание параметров —

socket_family — это либо AF_UNIX, либо AF_INET, как объяснялось ранее.

socket_type — это либо SOCK_STREAM, либо SOCK_DGRAM.

протокол — обычно не указывается, по умолчанию 0.

socket_family — это либо AF_UNIX, либо AF_INET, как объяснялось ранее.

socket_type — это либо SOCK_STREAM, либо SOCK_DGRAM.

протокол — обычно не указывается, по умолчанию 0.

Если у вас есть объект сокета , вы можете использовать необходимые функции для создания вашей клиентской или серверной программы. Ниже приведен список необходимых функций —

Этот метод привязывает адрес (имя хоста, пара номеров портов) к сокету.

Этот метод устанавливает и запускает прослушиватель TCP.

Это пассивно принимает TCP-клиентское соединение, ожидая, пока соединение не будет установлено (блокируется).

Этот метод привязывает адрес (имя хоста, пара номеров портов) к сокету.

Этот метод устанавливает и запускает прослушиватель TCP.

Это пассивно принимает TCP-клиентское соединение, ожидая, пока соединение не будет установлено (блокируется).

Методы клиентских сокетов

Этот метод активно инициирует подключение к серверу TCP.

Этот метод активно инициирует подключение к серверу TCP.

Общие методы сокетов

Этот метод закрывает сокет

socket.gethostname ()

Возвращает имя хоста.

Этот метод закрывает сокет

socket.gethostname ()

Возвращает имя хоста.

Простой сервер

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

Теперь вызовите функцию bind (hostname, port), чтобы указать порт для вашего сервиса на данном хосте.

Затем вызовите метод accept возвращаемого объекта. Этот метод ожидает подключения клиента к указанному вами порту, а затем возвращает объект подключения , представляющий соединение с этим клиентом.

Простой клиент

Давайте напишем очень простую клиентскую программу, которая открывает соединение с данным портом 12345 и данным хостом. Создать сокет-клиент очень просто с помощью функции модуля сокетов Python.

Socket.connect (имя хоста, порт) открывает TCP-соединение с именем хоста на порту . Когда у вас есть открытый сокет, вы можете читать из него, как любой объект ввода-вывода. Когда закончите, не забудьте закрыть его, как вы бы закрыли файл.

пример

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

Теперь запустите этот server.py в фоновом режиме, а затем запустите вышеуказанный client.py, чтобы увидеть результат.

Выход

Это даст следующий результат —

Интернет-модули Python

Список некоторых важных модулей в Python Network / Интернет-программировании приведен ниже —

Пожалуйста, проверьте все библиотеки, упомянутые выше, для работы с протоколами FTP, SMTP, POP и IMAP.

Дальнейшие чтения

Это было быстрое начало с программированием сокетов. Это обширная тема. Рекомендуется перейти по следующей ссылке, чтобы найти более подробную информацию —

Шпаргалка по сетевому программированию на Python

Все таблицы, представленные в шпаргалках, также представлены в таблицах ниже, которые легко скопировать и вставить.

Шпаргалка по сетевому программированию на Python крышки:

  • Обязательные общие установочные модули: PIP и IDLE
  • Лучшие библиотеки сетевого программирования Python
  • Сетевая экспертиза: необходимые библиотеки и скрипты на python
  • Ключевые слова Python
  • Типы данных, математические операторы
  • Анализ сети с помощью Python
  • Библиотека dnspython
  • Socket Module (интерфейс API Беркли)
  • Типы сокетов, создание сокетов
  • Примеры сокетов
  • Примеры скриптов
  • Модули разбора

Посмотреть или скачать Cheat Sheet JPG изображение

Щелкните правой кнопкой мыши на изображении ниже, чтобы сохранить файл JPG (1987 ширина x 2362 высота в пикселях), или нажмите здесь, чтобы открыть его в новой вкладке браузера. Как только изображение откроется в новом окне, вам может потребоваться нажать на изображение, чтобы увеличить его и просмотреть полноразмерный файл JPEG..

Шпаргалка по сетевому программированию на Python

Просмотреть или скачать PDF-файл шпаргалки

Загрузите PDF-файл шпаргалки здесь. Когда он откроется в новой вкладке браузера, просто щелкните правой кнопкой мыши на PDF и перейдите в меню загрузки.

Что входит в этот шпаргалку

Следующие категории и предметы были включены в шпаргалку:

Обязательные общие установочные модули: PIP и IDLE

PIP (установщик пакетов Python)

IDLE (интегрированная среда разработки и обучения)

Лучшие библиотеки сетевого программирования Python

Веб-фреймворк Python высокого уровня для быстрой и прагматичной разработки

Пикос (ранее Асинкоро)

Платформа Python для асинхронного, параллельного, сетевого, распределенного программирования и распределенных вычислений

Простой способ создания масштабируемых сетевых программ

Уровень абстракции сетевой автоматизации и программируемости с поддержкой нескольких поставщиков - для работы с поставщиками услуг

Сетевая библиотека на основе сопрограмм Python, которая использует greenlet для обеспечения высокоуровневого синхронного API поверх цикла событий libev или libuv

Сетевая экспертиза: необходимые библиотеки и скрипты на python

Агент системного и сетевого мониторинга, безопасности и анализа производительности для python

Инструмент для захвата небольших пакетов на основе Python и PCAP

Реализация протокола SSHv2, обеспечивающего функциональность как клиента, так и сервера

Установщик пакетов для python

Индекс пакетов Python (PyPI)

Репозиторий программного обеспечения для Питона

Ключевые слова Python

Python 2.7.15+ ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'кроме', 'exec', ' наконец, ',' для ',' из ',' global ',' if ',' import ',' in ',' is ',' lambda ',' not ',' или ',' pass ',' print ' , 'Raise', 'Return', 'Try', 'while', 'with', 'yield']

Python 3.8.0 ['False', 'None', 'True', 'и', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', ' del ',' elif ',' else ',' кроме ',' finally ',' for ',' from ',' global ',' if ',' import ',' in ',' is ',' lambda ' , 'нелокальный', 'not', 'или', 'pass', 'повысить', 'return', 'try', 'while', 'with', 'yield']

Типы данных

ул - х = "Привет, мир"

int, float, комплекс

список, кортеж, диапазон

байты, bytearray, просмотр памяти

Математические операторы

экспонент 4 ** 2 = 16

Modulus / Остаток 43% 5 = 3

Целочисленное деление 11 // 5 = 2

разделение 11/5 = 2,2

умножение 3 * 3 = 9

Вычитание 8 - 3 = 5

прибавление 2 + 2 = 4

Больше или равно

Комментарии

Может использоваться в начале строки или изнутри строки до конца строки

Анализ сети с помощью Python

Используйте NMAP со сканером портов

Команды для запуска сканирования NMAP

Команды NMAP, используемые с python

Библиотека dnspython

Получить цель MX и имя предпочтения

Socket Module (интерфейс API Беркли)

Основные функции и методы

socket () • ind () • listen () • accept () • connect () • connect_ex () • send () • recv () • close ()

Типы сокетов

Для протоколов TCP • Надежная передача • Последовательность пакетов • Ориентированный на соединение • Двунаправленный

Для протоколов UDP • Ненадежная передача • Нет последовательности пакетов • Без установления соединения (UDP) • Не двунаправленный

Создание сокетов

SOCK_STREAM или SOCK_DGRAM для TCP & UDP соответственно

Например, TCP - UDP2 = сокет. сокет (socket.AF_INET, socket.SOCK_DGRAM)

Например, UDP - TCP2 = сокет. сокет (socket.AF_INET, socket.SOCK_STREAM)

Метод клиентского сокета

Метод сокета сервера

Методы сокетов TCP

Методы сокета UDP

Больше методов сокетов

Закройте разъем сокета

Возвращает строку, которая включает имя хоста текущего ПК

Возвращает строку, которая включает имя хоста и IP-адрес текущего ПК

Настройка и запуск прослушивателя TCP

Присоедините (имя хоста, номер порта) к сокету

Ожидание TCP-соединения с клиентом

Инициировать соединение с сервером TCP

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

Прикрепить указанный локальный адрес к сокету

Данные, отправленные через сокет, присваиваются данному удаленному адресу

Возвращает удаленный адрес, к которому подключен сокет

Возвращает адрес собственной локальной конечной точки сокета

Принудительно установить пакет данных на определенный удаленный адрес

Удалить / удалить блок

Получить номер порта, используя доменное имя

Проверьте поддержку IPV6

getaddrinfo () - привязывает сервер к порту

Примеры сокетов

Пример сокета на стороне клиента

Пример сокета на стороне клиента с комментариями

В целом сетевые службы следуют традиционной модели клиент-сервер. Один компьютер действует как сервер для предоставления определенной услуги, а другой компьютер представляет клиентскую сторону, которая использует эту услугу. Для связи по сети в игру вступает сетевой сокет , в основном называемый только сокетом. Этот вид связи сокетов может даже использоваться внутренне в компьютере для межпроцессной связи (IPC).

В этой статье объясняется, как написать простое клиент-серверное приложение, которое взаимодействует через сетевой сокет с использованием языка программирования Python. Для простоты наш примерный сервер выводит только полученные данные в stdout. Идея клиент-серверного приложения-это датчик на метеостанции, который собирает данные о температуре с течением времени и отправляет собранные данные в серверное приложение, где данные обрабатываются дальше.

Что такое розетка?

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

Обе стороны взаимодействуют друг с другом путем записи или чтения из сетевого сокета. Технический эквивалент в реальности-это телефонная связь между двумя участниками. Сетевая розетка представляет собой соответствующий номер телефонной линии или договор в случае сотовых телефонов.

Пример

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

В этом случае и клиент, и сервер работают на одном компьютере. Сокет имеет соответствующий номер порта, который в нашем случае равен 23456. При желании вы можете выбрать другой номер порта из неограниченного диапазона номеров от 1024 до 65535.

Сервер

Загрузив дополнительный модуль Python socket , с помощью сокета создается сокет потоковой передачи Интернета.socket класс с двумя параметрами socket.AF_INET и сокет.SOCK_STREAM . Поиск имени хоста, полного доменного имени и IP-адреса осуществляется методами gethostname () , getfqdn () и gethostbyname () соответственно. Далее сокет привязывается к IP-адресу и номеру порта 23456 с помощью метода bind () .

С помощью метода listen() сервер прослушивает входящие соединения на указанном порту. В цикле while сервер ожидает входящих запросов и принимает их с помощью метода accept () . Данные, представленные клиентом, считываются с помощью метода recv() в виде фрагментов по 64 байта и просто выводятся в stdout. Наконец, текущее соединение закрывается, если никакие дополнительные данные не отправляются от клиента.

клиент

Теперь посмотрим на клиентскую сторону. Код Python в основном похож на серверную сторону, за исключением использования сокета – вместо этого клиент использует метод connect () . В цикле for данные о температуре отправляются на сервер с помощью метода sendall () . Вызов метода time.sleep(2) приостанавливает работу клиента на две секунды, прежде чем он отправит еще одно показание температуры. После отправки всех данных о температуре из списка соединение окончательно закрывается с помощью метода close () .

Запуск сервера и клиента

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

На двух рисунках ниже показаны соответствующие выходные данные примера программы:

Вывод

Сетевой сокет — это эндпоинт межпроцессного взаимодействия в компьютерной сети. В Python Standard Library есть модуль socket, предоставляющий низкоуровневый сетевой интерфейс. Этот интерфейс является общим для разных языков программирования, поскольку он использует системные вызовы на уровне операционной системы.

Для создания сокета существует функция, называемая socket . Она принимает аргументы family , type и proto (подробнее см. в документации). Чтобы создать TCP-сокет, нужно использовать socket.AF_INET или socket.AF_INET6 для family и socket.SOCK_STREAM для type .

Пример Python socket:

Функция возвращает объект сокета, который имеет следующие основные методы:

  • bind()
  • listen()
  • accept()
  • connect()
  • send()
  • recv()

Методы bind() , listen() и accept() специфичны для серверных сокетов, а метод connect() — для клиентских. send() и recv() являются общими для обоих типов сокетов. Приведем пример Echo-сервера, взятый из документации:

Здесь мы создаем серверный сокет, привязываем его к localhost и 50000-му порту и начинаем прослушивать входящие соединения.

Чтобы принять входящее соединение, мы вызываем метод accept() , который будет блокироваться до тех пор, пока не подключится новый клиент. Когда это произойдет, метод создаcт новый сокет и вернет его вместе с адресом клиента.

Затем он в бесконечном цикле считывает данные из сокета партиями по 1024 байта, используя метод recv() , пока не вернет пустую строку. После этого он отправляет все входящие данные обратно, используя метод sendall() , который в свою очередь многократно вызывает метод send() . И после этого сервер просто закрывает клиентское соединение. Данный пример может обрабатывать только одно входящее соединение, потому что он не вызывает accept() в цикле.

Код на стороне клиента выглядит проще:

Вместо методов bind() и listen() он вызывает только метод connect() и сразу же отправляет данные на сервер. Затем он получает обратно 1024 байта, закрывает сокет и выводит полученные данные.

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

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

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

Существует множество интерфейсов для разных операционных систем:

Все они примерно одинаковы, поэтому давайте создадим сервер с помощью Python select. Пример Python select :

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

Создание серверного сокета происходит так же, кроме одной строки: server.setblocking(0) . Это нужно для того, чтобы сокет не блокировался. Такой сервер более продвинутый, поскольку он может обслуживать более одного клиента. Главная причина заключается в сокетах selecting :

Здесь мы вызываем метод select.select для того, чтобы операционная система проверила, готовы ли указанные сокеты к записи и чтению, и нет ли каких-либо исключений. Метод передает три списка сокетов, чтобы указать, какой сокет должен быть доступен для записи, какой — для чтения и какой следует проверить на наличие ошибок.

Этот вызов (если не передан аргумент timeout ) блокирует программу до тех пор, пока какие-либо из переданных сокетов не будут готовы. В этот момент вызов вернет три списка сокетов для указанных операций.

Так работают сокеты на низком уровне. Однако в большинстве случаев нет необходимости реализовывать настолько низкоуровневую логику. Рекомендуется использовать более высокоуровневые абстракции, такие как Twisted, Tornado или ZeroMQ, в зависимости от ситуации.

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