Как сделать клиент серверное приложение python
Модуль socket обеспечивает доступ к интерфейсу сокета BSD. Он доступен во всех современных системах Unix, Windows, MacOS и, возможно, на дополнительных платформах.
Он включает в себя функции создания объекта сокета Socket , который и обрабатывает канал данных, а также функции, связанных с сетевыми задачами, такими как преобразование имени сервера в IP адрес и форматирование данных для отправки по сети.
Примечание. Поведение модуля может зависеть от платформы, поскольку выполняются вызовы API сокетов операционной системы.
Интерфейс Python представляет собой прямую трансляцию системного вызова Unix и интерфейса библиотеки для сокетов в объектно-ориентированный стиль Python. Функция socket.socket() возвращает объект Socket , методы которого реализуют различные системные вызовы сокетов.
Типы параметров функций модуля несколько более высокоуровневые, чем в интерфейсе языка C: как и в случае операций чтения/записи с файлами, распределение буфера при операциях приема данных происходит автоматически, а длина буфера неявно определяется операциями отправки.
Пример создания и использования сокетов на примере TCP/IP сервер и клиента.
Примечание. Для успешного тестирования примера, код клиента и сервера необходимо запускать в разных окнах терминала. Код сервера запускается первым.
TCP/IP сервер.
Вызов метода sock.listen(1) переводит сокет в режим сервера, а метод sock.accept() ожидает входящего соединения. Целочисленный аргумент у метода .listen - это количество соединений, которые система должна поставить в очередь в фоновом режиме, прежде чем отклонять новых клиентов. В этом примере предполагается, что одновременно будет работать только одно соединение.
Метод sock.accept() возвращает открытое соединение между сервером и клиентом вместе с адресом клиента. На самом деле соединение представляет собой другой сокет на другом порту (назначенный ядром). Данные считываются из соединения с помощью метод sock.recv() и передаются с помощью sock.sendall() .
Когда общение с клиентом завершено, соединение необходимо очистить с помощью sock.close() . В этом примере используется блок try/finally , чтобы гарантировать, что метод sock.close() всегда вызывается, даже в случае ошибки.
Клиентская программа настраивает свой сокет иначе, чем сервер. Вместо привязки к порту и прослушивания он использует метод sock.connect() для подключения сокета непосредственно к удаленному адресу.
TCP/IP клиент.
Работа клиента и сервера вместе.
Клиент и сервер должны запускаться в отдельных окнах терминала, чтобы они могли взаимодействовать друг с другом. Выходные данные сервера показывают входящее соединение и данные, а также ответ, отправленный обратно клиенту.
Сегодня мы рассмотрим пример программирования сокетов Python. Мы создадим серверные и клиентские приложения на Python.
Программирование сокетов
Чтобы понять программирование сокетов Python, нам нужно знать о трех интересных темах – Socket Server, Socket Client и Socket.
Итак, что такое сервер? Сервер – это программное обеспечение, которое ожидает запросов клиентов и обслуживает или обрабатывает их соответственно.
С другой стороны, клиент запрашивает эту услугу. Клиентская программа запрашивает некоторые ресурсы к серверу, и сервер отвечает на этот запрос.
Socket – это конечная точка двунаправленного канала связи между сервером и клиентом. Сокеты могут обмениваться данными внутри процесса, между процессами на одной машине или между процессами на разных машинах. Для любого взаимодействия с удаленной программой мы должны подключаться через порт сокета.
Основная цель этого руководства по программированию сокетов – познакомить вас с тем, как сервер сокетов и клиент взаимодействуют друг с другом. Вы также узнаете, как написать программу сервера сокетов в Python.
Пример
Ранее мы говорили, что клиент сокета запрашивает некоторые ресурсы у сервера, и сервер отвечает на этот запрос.
Итак, мы разработаем и серверную, и клиентскую модель, чтобы каждый мог общаться с ними. Шаги можно рассматривать так:
Сервер сокетов
Мы сохраним программу сервера сокетов, как socket_server.py. Чтобы использовать соединение, нам нужно импортировать модуль сокета.
Затем последовательно нам нужно выполнить некоторую задачу, чтобы установить соединение между сервером и клиентом.
Мы можем получить адрес хоста с помощью функции socket.gethostname(). Рекомендуется использовать адрес порта пользователя выше 1024, поскольку номер порта меньше 1024 зарезервирован для стандартного интернет-протокола.
Смотрите приведенный ниже пример кода сервера:
Итак, наш сервер сокетов работает на порту 5000 и будет ждать запроса клиента. Если вы хотите, чтобы сервер не завершал работу при закрытии клиентского соединения, просто удалите условие if и оператор break. Цикл while используется для бесконечного запуска серверной программы и ожидания клиентского запроса.
Клиент сокета
Мы сохраним клиентскую программу сокета python как socket_client.py. Эта программа похожа на серверную, за исключением привязки.
Основное различие между серверной и клиентской программой состоит в том, что в серверной программе необходимо связать адрес хоста и адрес порта вместе.
Смотрите ниже пример кода клиента сокета:
Вывод
Чтобы увидеть результат, сначала запустите программу сервера сокетов. Затем запустите клиентскую программу. После этого напишите что-нибудь из клиентской программы. Затем снова напишите ответ от серверной программы.
Наконец, напишите «до свидания» из клиентской программы, чтобы завершить обе программы. Ниже короткое видео покажет, как это работало на моем тестовом прогоне примеров программ сервера сокетов и клиента.
Обратите внимание, что сервер сокетов работает на порту 5000, но клиенту также требуется порт сокета для подключения к серверу. Этот порт назначается случайным образом при вызове клиентского соединения. В данном случае это 57822.
В целом сетевые службы следуют традиционной модели клиент-сервер. Один компьютер действует как сервер для предоставления определенной услуги, а другой компьютер представляет клиентскую сторону, которая использует эту услугу. Для связи по сети в игру вступает сетевой сокет , в основном называемый только сокетом. Этот вид связи сокетов может даже использоваться внутренне в компьютере для межпроцессной связи (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. Наконец, текущее соединение закрывается, если никакие дополнительные данные не отправляются от клиента.
клиент
Запуск сервера и клиента
На двух рисунках ниже показаны соответствующие выходные данные примера программы:
Вывод
Протокол
TCP используют, чтобы формировать между компьютерами двусторонний канал обмена данными. Благодаря TCP пакеты гарантированно доставляются с соблюдением порядка их очередности, с автоматическим разбиением данных на пакеты и контролем их передачи. В то же время TCP работает медленно, так как потерянные пакеты многократно повторно отправляются, а операций, выполняемых над пакетами, слишком много.
Протокол UDP — низкоуровневый. С его помощью компьютеры могут отправлять и получать информацию в виде отдельных пакетов, не создавая логическое соединение. В отличие от TCP, взаимодействия по протоколу UDP не отличаются надежностью. Это усложняет управление ими в приложениях, в которых при обмене информацией нужны гарантии. Поэтому большинство интернет-приложений используют TCP.
Работа с сокетами в Python
Для создания сокетов в питоне используется модуль socket. В нем так же имеются методы для , установление и закрытие соединения, отправку данных по сети и их получение и другие операции.
Общие | Серверные | Клиентские |
socket — создать сокет | bind — привязать сокет к IP-адресу и порту машины | connect — установить соединение |
send — передать данные | listen — просигнализировать о готовности принимать соединения | |
recv — получить данные | accept — принять запрос на установку соединения | |
close — закрыть соединение |
Работа ТСР протокола
Чтобы понять, как с сокетом работает протокол ТСР, посмотрим на изображение ниже. Пояснение будет в коде программы (для примера мы отправляем клиенту текущее время)
Серверная часть:
Если вы работаете в среде программирования, то разрешите вашему серверу работать в вашей локальной сети:
Клиентская часть
from socket import *
Результат клиентской части (после запуска сервера):
Результат серверной части (после подключения клиента):
Как происходит кодирование/декодирование данных?
Строки, байты, изменяемые строки байтов:
from socket import *
import time
JSON Instant Messaging
Весь скомпилированный JSON-объект должен уложиться в 640 символов.
Аутентификация
Для того, чтобы инициализировать процесс аутентификации, надо создать такой JSON-объект:
Ответы сервера будут содержать поле response, и может быть еще одно (необязательное) поле alert/error с текстом ошибки.
Подключение, отключение, авторизация
В сети/ не в сети
В свою очередь, сервер посылает специальный probe-запрос для проверки доступности клиента:
Алерты и ошибки сервера
Тоже самое, что и отправка обычному пользователю, только в поле to ставится решетка с названием чатрума
Читайте также: