Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
sockets, двустороннее взаимодействие двух программ
Давненько я не писал в мой канал. Две недели прошло. Причины были, дописывал один текст. Теперь текст дописан и даже сдан. "Куда?" - спросите. Куда надо, туда и сдан ;) Главное я снова у себя на канале.
И решил теперь зайти с козырей. Сокеты сегодня. Взаимодействие двух программ. Кратко о сценарии. Есть две программы. В общем случае на двух разных компьютерах ip-адреса (четырёхбайтовые) которых видны друг другу. Условно одну программу назовём сервером, а другую клиентом. Почёму условно? Да потому что обе программы в последствии как бы меняются ролями. Но в начале одна из программ (сервер) ждёт, когда вторая программа соединится с ней по известному ip-адресу и известному порту. Ну, а потом они начинают друг с другом обмениваться сообщениями. Пока программа, условно названная клиентом ни посылает серверу условное слово. У нас это слово Конец. Такие дела.
Сокет, как пишут книжки, точка соединения или объект соединения двух программ (процессов). Программы могут находится как на одном компьютере, так и на разных. Чтобы достучаться одной программы до другой она должна "знать" ip-адрес и порт. Должен как бы быть элемент договорённости. Обмен данными также предполагает некоторую договорённость. Так сказать, протокол уровня приложений. Что касается сетевых проколов, то с сокетами можно использовать протоколы TCP и UDP. Будем использовать TCP. На этом я о протоколах закончу, так как не хочу (пока) писать статью о сетевых протоколах. Да и чтобы понять работу наших программ протоколы не нужны.
Ниже представлены скриншоты программы-сервера и программы клиента. Первым запускается программа-сервер. С клавиатуры задается порт, который она будет слушать. На рис. 1 дан текстовый протокол вывода на консоль программы-сервер.
Для работы с сокетами подключается стандартная библиотека 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())
К сокетам мы ещё будем возвращаться. В частности в библиотеке PyQt5 также есть инструмент для работы с сокетами.
Честно говоря, я всегда мечтал написать свой мессенджер, да всё руки не доходили. Может быть вы возьмётесь?
Ну, пока всё!
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.