В этой статье мы рассмотрим клиент-серверную архитектуру на примере Python.
Питон – это универсальный язык программирования. С его помощью можно создать как бизнес-приложение, так и клиент-серверную модель. Второй вариант становится все более популярным и распространенным у разработчиков. Все это благодаря простому синтаксису Python.
В данной статье речь зайдет о так называемом сетевом программировании. Предстоит изучить не только клиент-серверные модели в Python, но и сокеты. В конце будет рассмотрен пример элементарного чата, написанного на этом языке программирования.
Протоколы
Сетевое программирование – это часть, отвечающая за обмен электронными материалами между сервером и клиентом. Соответствующими компонентами модели могут выступать не только физические servers и компьютеры, а также иное оборудование.
В основе клиент-серверной модели иногда заложена логическая реализация: в пределах одного стола или конкретного железа. Все манипуляции здесь будут применять некоторый свод правил по доставке, инкапсуляции и очередности пакетов и сетевого взаимодействия. Подобный принцип носит название протокола передачи данных.
В Питоне программное обеспечение сетевого характера обычно используют протоколы транспортного уровня двух видов: TCP и UDP.
О TCP
TCP протокол в Python встречается тогда, когда нужно обеспечить между компьютерами двусторонний канал обмена информации. Здесь требуется запомнить следующие сведения:
- При его задействовании пакеты будут обязательно доставляться с соблюдением порядка очередности и авто разбиением электронных материалов на пакеты. Предусматривается также контроль передачи информации.
- TCP не выделяется особой скоростью функционирования.
- Потерянные пакеты будут повторно и многократно отправляться. Это приводит к увеличению количества операций.
Соответствующий вариант гарантирует, что клиент точно получит всю необходимую информацию.
Кратко о UDP
UDP – это низкоуровневый протокол. Он позволяет устройствам отправлять и получать данные отдельными пакетами. Логическое соединение здесь будет отсутствовать.
UDP не выделяется надежностью. Клиент не получает никаких гарантий полноценного получения передаваемых сведений. Это создает определенные помехи при управлении протоколами в приложениях, где в основе заложена полнота получение электронных материалов и файлов. Подобные особенности приводят к тому, что при сетевом программировании в Python чаще встречается TCP.
Сокет – это…
Совет – своеобразный абстрактный объект, который представляет собой конечную точку соединения. Socket в Python можно использовать как файл. Он предусматривает считывание и получение электронных материалов.
Сокет – конечные точки двунаправленного канала связи. Взаимодействуют:
- в процессе;
- между процессами на одном устройстве;
- между процессами на разном оборудовании.
Реализовываются через разнообразные типы каналов. Содержат в себе несколько параметров. Среди них выделяют две составляющие – IP-адрес и порт.
Порты и адреса
Когда server принимает соединение, он присваивает своему сокету конкретный порт. Port – это число в заголовках пакетов TCP, UDP, которое указывает, для какого софта в системе используется IP-пакет.
Здесь требуется уяснить следующее:
- Ports с номерами 0-1023 не допустимо. Связано это с тем, что они уже зарезервированы под служебные сетевые протоколы.
- Клиент, отправляя информацию, тоже создает собственный socket.
- Два сокета по каждую сторону «системы» будут образовывать виртуальное соединение. По нему осуществляется передача электронных материалов.
- При использовании TCP создаются два сокета: один слушатель (listen) и второй – socket обмена данными. Первый переходит в ожидание и активизируется при новом соединении. Второй носит название accept.
При помощи этих сведений составить грамотный код, который будет поддерживать работу в сети, станет проще. Но без грамотного управления модель «clients server» реализовать проблематично.
Лексика
Каждый рассматриваемый компонент имеет собственную лексику. Программисту предстоит уяснить такие данные:
- Domain – это семейство protocols, используемое в виде транспортного механизма. Соответствующие значения выступают в качестве констант.
- Type – тип связи между имеющимися конечными точками. Обычно Sock_Stream применяется для протоколов, ориентированных на непосредственное соединение. Sock_Dgram – без «подключения».
- Protocol – чаще всего это – нуль. Он применяется для идентификации варианта протокола в пределах типа и домена.
- Hostname. Идентификатор сетевого интерфейса.
- Port – каждый сервер слушает клиентов, которые вызывают один или несколько портов. Порт может быть номером Fixnum, строчкой с номером портал или именем службы.
Теперь стоит выяснить, что собой представляет модуль сокета. Эта информация пригодится как новичкам, так и опытным программистам.
О модуле socket
Для того, чтобы создать сокет, требуется использовать функцию под названием socket.socket() через модуль socket. У него такой синтаксис:
А вот описание имеющихся параметров:
- _family – AF_UNIX или AF_INET;
- _type – Sock_Stream или Sock_Dgram;
- protocol – обычно не прописывается, по умолчанию – 0.
При наличии объекта «со кет» можно задействовать функции для клиентского или серверного programming.
Подключение сервера
Вот методы, которые помогут подключить сервер:
- s.bind – связка адреса сокетом;
- s.listen – установка и запуск прослушивателя TCP;
- s.accept – пассивное принятие TCP-клиентского соединения, ожидая блокировки.
У сокета есть метод s.connect. Он активно проводит инициирование подключения к серверу TCP.
Общие методы
Каждый socket может использовать такие общие methods:
- s.recv – получение сообщения;
- s.send – передача текста;
- s.recvfrom – получение сообщения UDP;
- s.sendto – передача текста UDP;
- s.close – закрытие socket;
- socket.gethostname – возврат имени хоста.
Теперь, когда понятия import socket, а также client, server и print разобраны, можно взглянуть на пример элементарного чата на Питоне. Это – network приложение.
Пример чата
Сначала требуется написать серверную часть. А именно – то, что принимает соединение. Пример – по порту 5050. Сначала осуществляется подключение:
Далее – непосредственное создание в коде:
Нужно связать рассмотренный ранее компонент с интерфейсом и портом:
Теперь – создать средство принятия сообщений и их отправки:
А вот клиентская часть:
Остается настроить шифрование. Стоит прибегнуть к самому простому варианту – алгоритм XOR. Его ключевая идея – если есть некоторая величина, есть некий ключ шифрования, то можно через него зашифровать исходные электронные материалы. Для этого побитно применяется операция XOR.
В виде кода это выглядит так:
Теперь остается лишь соединить все части кода и посмотреть на получившийся результат. Пример элементарен и примитивен, но для новичков он отлично подходит.
Вот туториалы, которые помогут лучше разобраться в рассмотренной тематике. А специализированные компьютерные дистанционные курсы дадут наиболее развернутую информацию по интересующему направлению.