Найти тему
programmer's notes (python and more)

Программирование на языке Python. Сокеты, примеры взаимодействия двух удалённых программ

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

sockets, двустороннее взаимодействие двух программ

Давненько я не писал в мой канал. Две недели прошло. Причины были, дописывал один текст. Теперь текст дописан и даже сдан. "Куда?" - спросите. Куда надо, туда и сдан ;) Главное я снова у себя на канале.

И решил теперь зайти с козырей. Сокеты сегодня. Взаимодействие двух программ. Кратко о сценарии. Есть две программы. В общем случае на двух разных компьютерах ip-адреса (четырёхбайтовые) которых видны друг другу. Условно одну программу назовём сервером, а другую клиентом. Почёму условно? Да потому что обе программы в последствии как бы меняются ролями. Но в начале одна из программ (сервер) ждёт, когда вторая программа соединится с ней по известному ip-адресу и известному порту. Ну, а потом они начинают друг с другом обмениваться сообщениями. Пока программа, условно названная клиентом ни посылает серверу условное слово. У нас это слово Конец. Такие дела.

Сокет, как пишут книжки, точка соединения или объект соединения двух программ (процессов). Программы могут находится как на одном компьютере, так и на разных. Чтобы достучаться одной программы до другой она должна "знать" ip-адрес и порт. Должен как бы быть элемент договорённости. Обмен данными также предполагает некоторую договорённость. Так сказать, протокол уровня приложений. Что касается сетевых проколов, то с сокетами можно использовать протоколы TCP и UDP. Будем использовать TCP. На этом я о протоколах закончу, так как не хочу (пока) писать статью о сетевых протоколах. Да и чтобы понять работу наших программ протоколы не нужны.

Ниже представлены скриншоты программы-сервера и программы клиента. Первым запускается программа-сервер. С клавиатуры задается порт, который она будет слушать. На рис. 1 дан текстовый протокол вывода на консоль программы-сервер.

Программа-сервер. Текст программы см. ниже по ссылке
Программа-сервер. Текст программы см. ниже по ссылке
primer278.py

Для работы с сокетами подключается стандартная библиотека Python socket. Для работы в сети с помощью сокетов создаётся объект с помощью socket.socket(). Параметры socket.AF_INET - используются адреса IPv4. socket.SOCK_STREAM - предполагается использование протокола TCP. bind() - привязка сокета к конкретному порту и ip-адресу. Имеется в виду адрес, по которому работает вот эта программа-сервер. listen() - сервер будет слушать, параметр указывает на размер очереди возможных клиентов. accept() - ожидание подключений. Возвращается объект - соединение и информация о соединении, в частности ip-адрес того, кто подключается. С помощью метода send() отсылается сообщение клиенту, который соединился. После чего создаётся ещё один объект-сокет (client). Он понадобиться чтобы подключиться к программе клиенту, который теперь будет играть роль сервера. Заранее обговорено, что порт будет на 1 больше. А ip-адрес мы уже узнали после соединения (ip2). А далее программа ждёт ответа с помощью recv(). После чего в цикле идёт обмен сообщениями. Поскольку данные передаются и принимаются как последовательности байтов, то нужно использовать decode() и encode().

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

Обратим также внимание на функцию get_ip(), которая возвращает ip-адрес данного компьютера:

return socket.gethostbyname(socket.gethostname())

Программа-клиент. Текст программы см. ниже по ссылке
Программа-клиент. Текст программы см. ниже по ссылке
primer279.py

Рис. 1. Протокол работы со стороны сервера
Рис. 1. Протокол работы со стороны сервера

Рис. 2. Протокол работы со стороны клиента
Рис. 2. Протокол работы со стороны клиента

К сокетам мы ещё будем возвращаться. В частности в библиотеке PyQt5 также есть инструмент для работы с сокетами.

Честно говоря, я всегда мечтал написать свой мессенджер, да всё руки не доходили. Может быть вы возьмётесь?

Ну, пока всё!

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

- Мы прислали мне какое-то странное сообщение. - Это байты, декодируйте его
- Мы прислали мне какое-то странное сообщение. - Это байты, декодируйте его