В сетевом программировании все работает легко и просто: клиент формирует и направляет запрос, сервер получает его и обрабатывает. Для реализации подобной модели необходимо использовать разнообразные языки программирования. В них имеются специальные функции и команды, помогающие добиться желаемого результата. Они используются для налаживания соединения между вычислительными устройствами в пределах одной и той же сети. Ключевую роль здесь играет так называемый сокет.
Далее предстоит познакомиться с этим элементом поближе. Необходимо выяснить, что собой представляет сокет, для чего и как он используется, изучить его ключевые функции и иные особенности. А еще – разобраться в принципах работы сетей. Предложенная информация рассчитана на широкий круг лиц. Она подойдет как обычным пользователям, так и IT-специалистам.
Определение
Задумываясь над тем, что такое сокет в сети, необходимо изучить его определение. Сокет – это программные объекты (интерфейсы), которые отвечают за определение конечной точки соединения.
Сокет – это абстрактный файл, обеспечивающий сетевую связность программного приложения. Программа за счет этого элемента способна устанавливать входящие и исходящие соединения, принимать данные. Работа сокета осуществляется на уровне операционной системы и предусматривает два параметра: порт и IP-адрес.
Протокол
Для обмена данными по сети необходимо использовать протоколы. Это – некоторый набор правил и принципов передачи и приема информации в клиент-серверных моделях. Протоколы отвечают за:
- упаковку данных;
- распаковку информации;
- передачу данных:
- прочие операции.
Далее предстоит познакомиться с сокетом Python. Для этого необходимо ориентироваться на протокол TCP (transmission Control Protocol).
С помощью соответствующего компонента удается задать правила выполнения основной части сетевых задач:
- подключение к базам данных;
- обеспечение взаимодействия сетевого характера;
- работа с веб-сервисами.
Есть еще один популярный протокол обмена данными – UDP. Он не требует подтверждения от принимающей стороны в отличие от TCP. Такой элемент не гарантирует стабильную передачу данных. TCP – это более надежный вариант информационного обмена. Он предусматривает гарантии доставки данных до получателя с сохранением очередности.
Если клиенту необходимо подключиться к серверу, он отправляет свои данные через «окно» (это и есть сокет). Соответствующая информация передается в TCP-протокол, которые заранее запускается на клиентской стороне. Данные проходят через специальный буфер и направляются на серверную сторону. Там информация снова направляется в буфер, а затем – в сокет.
Python и sockets
Python – достаточно простой и популярный язык программирования. Он часто используется в разработке, поэтому с его сокетами предстоит познакомиться далее. Для работы с рассматриваемыми элементами языком программирования используется модуль socket. В нем предусматривается реализация функций, отвечающих за создание нового сокета, установление и закрытие соединений, отправку данных по сети, а также их непосредственное получение.
Выше можно увидеть, как будет выглядеть соединение через TCP-протоколы в Python.
Ключевые функции
Для сетевого программирования необходимо использовать определенные функции модуля socket. Таблица, представленная ниже, поможет ознакомиться с ними.
Общие функции (для клиента и сервера) | |
socket() | Отвечает за создание сокета. Функция будет возвращать объект сокета, методы которого реализуют разнообразные системные вызовы сокетов. |
send() | Функция, использующаяся для отправки данных |
recv() | Получение данных |
close() | Закрытие соединения |
Клиентские функции | |
connect() | Установка соединения |
Серверные функции | |
bind() | Отвечает за привязку сокета к IP-адресу и порту устройства |
listen() | Указание о готовности принимать соединения |
accept() | Принятие запроса на установку соединения |
Чтобы лучше понимать принципы работы рассматриваемого элемента, лучше всего рассмотреть их на наглядном примере. Далее будет подробно изучен пример работы сокета на Python.
Пример использования
Для примера нужно представить ситуацию: клиент хочет получить от сервера данные о текущем времени и дате. Для этого требуется настроить соединение через TCP-протокол, сформировать запрос и отправить его на серверную часть. Для всего этого нужно использовать sockets.
Вот – блок кода, отвечающий за серверную часть исходного приложения:
Здесь:
- s = socket(AF_INET, SOCK_STREAM) – запуск функции socket() с двумя параметрами: communication domain (домен) и type of socket (тип). В качестве первой характеристики обычно передается значение AF_INET. Оно указывает на то, что создаваемый socket относится к сетевым. В качестве типа указан SOCK_STREAM, который указывает на то, что используемый сокет является потоковым. Он будет реализовывать последовательный двусторонний поток байтов при помощи TCP-протокола.
- s.blind((>>,7777)) – присваивание порта 7777.
- s.listen(5) – режим ожидания. Поддерживается работа сразу с 5 запросами. Слушающий процесс обычно расположен в цикле ожидания. Он активируется при появлении нового соединения.
- timestr.encode(‘utf-8’) – выбор формата обмена данными.
А вот – блок кода, отвечающий за клиентскую часть рассматриваемого приложения:
Здесь:
- s = socket(AF_INET, SOCK_STREAM) – функция, отвечающая за создание сокета.
- s.connect((‘localhost’, 7777)) – запуск функции connect с указанием сервера и порта.
- tm = s.recv(1024) – принятие не более 1024 байтов данных.
- tm.decode(‘utf-8’) – формат декодирования данных.
При работе с рассматриваемым элементом немаловажную роль играет размер буфера. Небольшие его «габариты» обеспечивают более быструю передачу данных, но их объем окажется очень маленьким.
Большой буфер пропускает через себя крупные информационные потоки, но требует значительных ресурсов. Это негативно сказывается на скорости обмена данными.
Вот – код, который поможет установить размер буфера в клиент-серверной модели:
Для реализации поставленной задачи нужно задействовать метод socket.setsockopt(level, optname, None, optlen: int). Он получает три параметра: уровень, имя и числовую переменную (сам размер буфера).
Тайм-аут
Для активности socket можно задать таймаут (время прослушивания), в течение которого осуществляется ожидание отправки или получения данных. Эта функция применяется к одному вызову операции чтения или записи.
Для реализации опции используется функция socket.settimeout(value). Value измеряется в секундах. После установленного времени socket будет блокироваться для операции. Если value = 0, рассматриваемый элемент переводится в неблокирующий режим. В нем операции выполняются немедленно.
Теперь понятно, для чего нужен сокет, а также принципы его работы. Лучше разобраться в изучаемом направлении помогут дистанционные компьютерные курсы.
Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus!