
Структура программы Сервер
При запуске программы считывается целочисленный аргумент из команды, который определяет конфигурацию сервера – его порт и данные, которые он получает от системы.
Код серверного приложения состоит из функций:
Получение размеров терминала: Функция get_terminal_size() определяет размер окна терминала в зависимости от операционной системы.
Получение информации о памяти: Функция get_memory() возвращает объем доступной оперативной памяти.
Сбор данных: Функция get_data() собирает и возвращает системные данные
Отправка сообщений: Функция send_message() отправляет сообщение клиенту, обрабатывая возможные блокировки.
Отправка состояния: Функция send_state() проверяет изменения в данных о состоянии системы и отправляет обновления клиенту.
Обработка новых клиентов: Функция on_new_client() управляет взаимодействием с новым клиентом, принимает сообщения и отправляет обновленное состояние.
Основная функция: Функция main() инициализирует сервер, настраивает сокет, принимает подключения и создает потоки для обработки клиентов.
Программа организована таким образом, что в основном потоке осуществляется сбор системной информации и обработка новых подключений. При каждом новом подключении создается отдельный поток, в котором вызывается функция on_new_client. Эта функция отвечает за взаимодействие с клиентом, включая получение сообщений, их обработку и отправку обновленной информации о состоянии системы.
В основном потоке сервер инициирует создание сокета, который связывается с заданным портом, после чего начинает прослушивание входящих подключений. Когда клиент устанавливает соединение, для него создается отдельный поток, который занимается обработкой взаимодействия с этим клиентом. Этот поток принимает сообщения от клиента и отправляет ему обновленные данные о состоянии системы, включая информацию о размере терминала и доступной памяти. Такой подход позволяет серверу эффективно управлять множеством одновременных подключений, обеспечивая асинхронное взаимодействие и оптимальное использование системных ресурсов.
Каждый поток, созданный для клиента, содержит цикл обработки, который позволяет ему постоянно ожидать входящие сообщения и реагировать на них. В то время как главный поток сосредоточен на обработке новых подключений и обновлении системных параметров, клиентские потоки занимаются получением и обработкой сообщений от клиентов, а также отправкой актуальных данных о состоянии системы. Это многопоточное решение способствует высокой производительности и надежности сервера, позволяя ему эффективно обслуживать множество клиентов одновременно без потери качества обслуживания.
Клиент
Клиентская часть программы состоит из класса Application, который наследуется от tk.Frame, и содержит методы для управления графическим интерфейсом и обработки событий. При запуске приложения вызывается метод run, который инициирует основной цикл обработки событий.
Класс Application включает в себя элементы управления для работы с двумя серверами, такие как кнопки подключения, текстовые поля для отображения логов и статусов, а также элементы управления для периодических запросов. Метод send_periodic_requests отвечает за отправку сообщений на серверы с заданным интервалом, если периодические запросы активированы, и рассчитывает время следующей отправки.
Методы connect_server и disconnect_server обеспечивают подключение и отключение от серверов, соответственно. Метод switch_method позволяет изменять режим работы – либо с использованием callback, либо с использованием polling.
Методы set_value_1_subscription_server_1 и set_value_2_subscription_server_2 управляют подпиской на обновления параметров, отправляя соответствующие данные на сервер. Метод get_polling_data инициирует запрос на получение обновлений в режиме polling.
В основном цикле обработки App вызывается метод receive_messages_server, который получает сообщения от серверов, проверяет, что соединение активно, и передает полученные данные в метод process_message, который обновляет параметры и отображает их в интерфейсе.