Лаб. работа “Концепция распределённой обработки данных и технологии удалённой обработки данных”
Цель работы
Практически реализовать концепцию удалённого вызова процедур (RPC). Разработать клиент-серверное приложение «Удалённый калькулятор», в котором клиентский GUI только отправляет на сервер данные для вычислений, а вся логика обработки выполняется на стороне сервера.
Теоретические сведения
Удалённый вызов процедур (RPC)
RPC (Remote Procedure Call) — технология, позволяющая программе вызывать функции на удалённом сервере так, как если бы они выполнялись локально. Клиент отправляет запрос с параметрами, сервер выполняет вычисление и возвращает результат.
Архитектура клиент-серверного приложения
Протокол обмена
Простой текстовый протокол с разделителем строк \n:
Запрос: OPERATION:operand1:operator:operand2\n
Ответ: RESULT:value\n
Ошибка: ERROR:description\n
История: HISTORY:op1 op op2 = result\n
QTcpServer — обработка нескольких клиентов
void Server::onNewConnection() {
QTcpSocket* client = server->nextPendingConnection();
clients.append(client);
connect(client, &QTcpSocket::readyRead, this, &Server::processRequest);
connect(client, &QTcpSocket::disconnected, this, [this, client]() {
clients.removeAll(client);
client->deleteLater();
});
}Разбор запроса на сервере
void Server::processRequest() {
QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());
QString request = QString::fromUtf8(socket->readAll()).trimmed();
QStringList parts = request.split(':');
if (parts[0] == "CALC") {
// parts[1] = operand1, parts[2] = operator, parts[3] = operand2
double result = calculate(parts[1].toDouble(), parts[2], parts[3].toDouble());
socket->write(("RESULT:" + QString::number(result) + "\n").toUtf8());
}
}Задание для выполнения
Разработать клиент-серверное приложение «Удалённый калькулятор». Сервер выполняет все вычисления и хранит историю. Клиент предоставляет графический интерфейс для ввода выражений и отображения результатов.
Серверная часть (консольное приложение)
Создать класс
CalculatorServer(наследникQObject):- поле:
QTcpServer* server - поле:
QMap<QString, QStringList> history— история вычислений по клиентам (ключ — адрес клиента) - метод
start(int port)— запуск сервера
- поле:
Обработка команд (слот
processRequest()):Команда Формат Ответ Вычисление CALC:операнд1:оператор:операнд2RESULT:значениеилиERROR:описаниеИстория HISTORYHISTORY:строка1\|строка2\|...(разделитель\|)Очистка истории CLEAROKУнарные операции SQRT:число,POW:основание:показательRESULT:значениеилиERROR:описаниеПоддерживаемые операции:
+,-,*,/,SQRT(квадратный корень),POW(возведение в степень). При делении на ноль или отрицательном аргументеSQRT— ответERROR.Сервер выводит в консоль каждый запрос и ответ.
Клиентская часть (GUI-приложение, Qt Widgets)
Создать класс
CalculatorClient(наследникQMainWindow):Центральная область:
QLabel«Выражение:»- Группа
QLineEdit: поле «Операнд 1»,QComboBoxдля выбора операции (+,-,*,/,√,^), поле «Операнд 2» (скрыто/неактивно для унарных операций) QPushButton«Вычислить» — отправка запроса на серверQPushButton«Очистить» — очистка полей вводаQLabel«Результат:» +QLineEdit(только для чтения) — отображение результатаQLabel«Статус:» +QLabel— статус подключенияQTextEdit(только для чтения) — история вычислений, полученная с сервераQPushButton«Обновить историю» — запрос истории с сервера
Меню:
- «Соединение» → «Подключиться…» (диалог: IP + порт), «Отключиться», «Выход»
- «История» → «Обновить», «Очистить на сервере»
Логика:
- При нажатии «Вычислить» — сформировать строку запроса, отправить через
QTcpSocket - При получении ответа
RESULT:...— отобразить в поле результата, добавить в локальную историю - При получении ответа
ERROR:...— отобразить ошибку красным цветом - При выборе унарной операции (
√) — скрыть поле «Операнд 2», при выборе бинарной — показать - Кнопка «Вычислить» неактивна при отключении
- При нажатии «Вычислить» — сформировать строку запроса, отправить через
Пример ожидаемого вывода
Сервер (консоль):
[Server] Запущен на порту 8080
[+] 127.0.0.1:54321 подключен
[Запрос] 127.0.0.1 → CALC:15:+:7
[Ответ] 127.0.0.1 ← RESULT:22
[Запрос] 127.0.0.1 → CALC:100:/:0
[Ответ] 127.0.0.1 ← ERROR:Деление на ноль
[Запрос] 127.0.0.1 → SQRT:144
[Ответ] 127.0.0.1 ← RESULT:12
[Запрос] 127.0.0.1 → HISTORY
[Ответ] 127.0.0.1 ← HISTORY:15 + 7 = 22|100 / 0 = ERROR|√144 = 12
Клиент (GUI): 
Индивидуальные задания
Каждый вариант реализует клиент-серверное приложение: сервер — консольное приложение на QTcpServer, обрабатывающее текстовый протокол; клиент — GUI-приложение на Qt Widgets, отправляющее запросы и отображающее результаты. Сервер должен поддерживать одновременное подключение нескольких клиентов.
Вариант 1. Удалённый справочник DNS
Серверная часть (консольное приложение):
Сервер хранит std::map<std::string, std::string> (домен → IP-адрес), инициализируется 5+ записями. Команды:
| Команда | Формат | Ответ |
|---|---|---|
| Поиск | LOOKUP:домен |
RESULT:IP или ERROR:NOT_FOUND |
| Добавление | ADD:домен:IP |
OK или ERROR:EXISTS |
| Удаление | REMOVE:домен |
OK или ERROR:NOT_FOUND |
| Список всех | LIST |
RECORDS:домен1:IP1\|домен2:IP2\|... |
| Количество | COUNT |
COUNT:n |
Сервер выводит каждый запрос в консоль.
Клиентская часть (GUI-приложение):
QLineEditдля доменаQLineEditдля IP-адресаQPushButton«Найти», «Добавить», «Удалить»QListWidgetдля списка всех записейQLabelдля результата поиска
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «Данные» → «Обновить список», «Очистить»
Подключение нескольких клиентов — записи общие.
Вариант 2. Удалённый калькулятор
Серверная часть (консольное приложение):
| Команда | Формат | Ответ |
|---|---|---|
| Вычисление | CALC:операнд1:оператор:операнд2 |
RESULT:значение или ERROR:описание |
| Квадратный корень | SQRT:число |
RESULT:значение или ERROR:описание |
| Возведение в степень | POW:основание:показатель |
RESULT:значение или ERROR:описание |
| История | HISTORY |
HISTORY:строка1\|строка2\|... |
| Очистка истории | CLEAR |
OK |
Клиентская часть (GUI-приложение):
- Группа
QLineEdit: поле «Операнд 1»,QComboBoxдля выбора операции (+,-,*,/,√,^), поле «Операнд 2» (скрыто/неактивно для унарных операций) QPushButton«Вычислить», «Очистить»QLabel«Результат:» +QLineEdit(только для чтения)QTextEdit(только для чтения) — история вычисленийQPushButton«Обновить историю»
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «История» → «Обновить», «Очистить на сервере»
Вариант 3. Удалённый файловый менеджер
Серверная часть (консольное приложение):
Сервер хранит файлы в памяти (std::map<std::string, std::string> имя → содержимое):
| Команда | Формат | Ответ |
|---|---|---|
| Создать файл | TOUCH:имя |
OK или ERROR:файл существует |
| Список файлов | LS |
LS:файл1\|файл2\|... |
| Удалить файл | RM:имя |
OK или ERROR:файл не найден |
| Размер файла | SIZE:имя |
SIZE:байты или ERROR:файл не найден |
| Записать в файл | WRITE:имя:содержимое |
OK |
| Прочитать файл | READ:имя |
READ:содержимое или ERROR:файл не найден |
Клиентская часть (GUI-приложение):
QListWidgetдля списка файлов (двойной клик → загрузка содержимого)QLineEditдля имени файлаQTextEditдля содержимого файлаQPushButton«Создать», «Удалить», «Сохранить», «Обновить список»QLabelдля размера выбранного файла
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «Файл» → «Создать», «Удалить», «Обновить»
Вариант 4. Удалённый мониторинг
Серверная часть (консольное приложение):
Сервер имитирует метрики системы (случайные значения), при запросе генерирует новые:
| Команда | Формат | Ответ |
|---|---|---|
| Загрузка CPU | CPU |
CPU:процент |
| Загрузка RAM | MEM |
MEM:процент |
| Загрузка диска | DISK |
DISK:процент |
| Все метрики | ALL |
ALL:cpu:mem:disk |
| История | HISTORY |
HISTORY:строка1\|строка2\|... (последние 10) |
Клиентская часть (GUI-приложение):
QProgressBarдля CPU, RAM, Disk (цвет: зелёный < 50%, жёлтый 50–80%, красный > 80%)QPushButton«Обновить»QTextEdit(только для чтения) — история измерений (временная метка + значения)
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «Мониторинг» → «Обновить», «Автообновление» (галочка), «Очистить историю»
Вариант 5. Удалённый лог-сервер
Серверная часть (консольное приложение):
Сервер принимает и хранит лог-сообщения:
| Команда | Формат | Ответ |
|---|---|---|
| Записать лог | LOG:уровень:сообщение |
OK |
| Все записи | GET |
GET:строка1\|строка2\|... |
| Фильтр по уровню | FILTER:уровень |
FILTER:строка1\|строка2\|... |
| Очистить | CLEAR |
OK |
| Статистика | COUNT |
COUNT:INFO:n\|WARN:n\|ERROR:n |
Уровни: INFO, WARN, ERROR, DEBUG.
Клиентская часть (GUI-приложение):
QComboBoxдля выбора уровня логированияQLineEditдля сообщенияQPushButton«Записать», «Показать все», «Фильтр», «Статистика», «Очистить»QTextEdit(только для чтения) — журнал записей
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «Журнал» → «Обновить», «Очистить», «Статистика»
Вариант 6. Удалённый почтовый клиент
Серверная часть (консольное приложение):
Сервер хранит почтовые ящики по клиентам (имитация):
| Команда | Формат | Ответ |
|---|---|---|
| Отправить письмо | SEND:кому:тема:текст |
OK |
| Входящие | INBOX |
INBOX:номер:от:тема\|номер:от:тема\|... |
| Прочитать письмо | READ:номер |
READ:от:тема:текст или ERROR:не найден |
| Удалить письмо | DELETE:номер |
OK или ERROR:не найден |
Клиентская часть (GUI-приложение):
QListWidgetдля списка входящих писем (номер, от, тема)QTextEdit(только для чтения) — содержимое выбранного письма- Группа отправки:
QLineEdit«Кому»,QLineEdit«Тема»,QTextEdit«Текст»,QPushButton«Отправить» QPushButton«Удалить»
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «Почта» → «Обновить входящие», «Удалить выбранное»
Вариант 7. Удалённый TO-DO менеджер
Серверная часть (консольное приложение):
Сервер хранит задачи по клиентам:
| Команда | Формат | Ответ |
|---|---|---|
| Добавить задачу | ADD:задача |
OK:номер |
| Выполнить | DONE:номер |
OK или ERROR:не найден/уже выполнена |
| Список задач | LIST |
LIST:номер:задача:статус\|... (статус: PENDING/DONE) |
| Очистить | CLEAR |
OK |
| Статистика | STATS |
STATS:выполнено:всего |
Клиентская часть (GUI-приложение):
QListWidgetдля списка задач (номер, задача, статус; выполненные — зачёркнуты)QLineEditдля ввода новой задачиQPushButton«Добавить», «Выполнить», «Очистить все»QLabelдля статистики («Выполнено: 3 из 7»)
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «Задачи» → «Обновить», «Очистить выполненные», «Статистика»
Вариант 8. Удалённый конвертер валют
Серверная часть (консольное приложение):
Сервер хранит курсы валют (относительно RUB):
| Команда | Формат | Ответ |
|---|---|---|
| Конвертация | CONVERT:сумма:из:в |
RESULT:значение или ERROR:неизвестная валюта |
| Все курсы | RATES |
RATES:USD:90.5\|EUR:98.3\|... |
| Обновить курс | UPDATE:валюта:курс |
OK или ERROR:неизвестная валюта |
Клиентская часть (GUI-приложение):
QDoubleSpinBoxдля суммыQComboBox«Из валюты» и «В валюту» (USD, EUR, CNY, RUB и др.)QPushButton«Конвертировать»QLabelдля результата конвертацииQTableWidgetилиQListWidgetдля отображения текущих курсов
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «Курсы» → «Обновить курсы», «Редактировать курс…»
Вариант 9. Удалённый погодный сервис
Серверная часть (консольное приложение):
Сервер хранит имитацию погоды для городов:
| Команда | Формат | Ответ |
|---|---|---|
| Текущая погода | WEATHER:город |
WEATHER:температура:влажность:ветер или ERROR:город не найден |
| Список городов | CITIES |
CITIES:город1\|город2\|... |
| Прогноз | FORECAST:город |
FORECAST:день1:temp1:день2:temp2:день3:temp3 или ERROR |
Клиентская часть (GUI-приложение):
QComboBoxдля выбора городаQPushButton«Получить погоду», «Прогноз на 3 дня»QLabelдля температуры, влажности, скорости ветраQTextEdit(только для чтения) для прогноза на 3 дня
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «Погода» → «Обновить», «Список городов»
Вариант 10. Удалённый генератор паролей
Серверная часть (консольное приложение):
| Команда | Формат | Ответ |
|---|---|---|
| Генерация | PASS:длина:тип |
PASSWORD:пароль |
| Пакетная генерация | BATCH:длина:тип:количество |
BATCH:пароль1\nпароль2\n... |
| Проверка сложности | STRENGTH:пароль |
STRENGTH:слабый/средний/сильный |
Типы: DIGITS (только цифры), ALPHA (буквы), MIXED (буквы + цифры), FULL (буквы + цифры + спецсимволы).
Клиентская часть (GUI-приложение):
QSpinBoxдля длины пароля (8–64)QComboBoxдля типа пароляQPushButton«Сгенерировать», «Сгенерировать пакет»QLineEdit(только для чтения) для результатаQPushButton«Проверить сложность»QTextEdit(только для чтения) — история сгенерированных паролей
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «Пароли» → «Копировать», «Очистить историю»
Вариант 11. Удалённый телефонный справочник
Серверная часть (консольное приложение):
Сервер хранит контакты (std::map<std::string, std::string> имя → телефон):
| Команда | Формат | Ответ |
|---|---|---|
| Добавить контакт | ADD:имя:телефон |
OK или ERROR:контакт существует |
| Найти по имени | FIND:имя |
FOUND:телефон или NOT_FOUND |
| Все контакты | ALL |
ALL:имя1:телефон1\|имя2:телефон2\|... |
| Удалить | DELETE:имя |
OK или ERROR:не найден |
| Поиск по телефону | SEARCH:телефон |
FOUND:имя или NOT_FOUND |
Клиентская часть (GUI-приложение):
QLineEditдля имени,QLineEditдля телефонаQPushButton«Добавить», «Найти по имени», «Найти по телефону», «Удалить», «Показать все»QListWidgetдля списка контактовQLabelдля статуса операции
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «Справочник» → «Показать все», «Очистить»
Вариант 12. Удалённый KV-хранилище
Серверная часть (консольное приложение):
| Команда | Формат | Ответ |
|---|---|---|
| Записать | SET:ключ:значение |
OK |
| Прочитать | GET:ключ |
VALUE:значение или NOT_FOUND |
| Удалить | DEL:ключ |
OK или NOT_FOUND |
| Список ключей | KEYS |
KEYS:ключ1\|ключ2\|... |
| Количество | COUNT |
COUNT:n |
Клиентская часть (GUI-приложение):
QLineEditдля ключа,QLineEditдля значенияQPushButton«Сохранить», «Получить», «Удалить»QListWidgetдля списка ключейQPushButton«Показать все ключи»QLabelдля количества записей
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «Хранилище» → «Показать ключи», «Очистить всё»
Вариант 13. Удалённый сервер анаграмм
Серверная часть (консольное приложение):
Сервер хранит словарь слов и находит анаграммы:
| Команда | Формат | Ответ |
|---|---|---|
| Найти анаграммы | ANAGRAM:слово |
ANAGRAM:слово1\|слово2\|... |
| Случайные слова | WORDS:длина |
WORDS:слово1\|слово2\|... |
| Проверить слово | VALIDATE:слово |
VALID:да или VALID:нет |
Клиентская часть (GUI-приложение):
QLineEditдля ввода словаQPushButton«Найти анаграммы», «Случайные слова», «Проверить слово»QSpinBoxдля длины случайных словQListWidgetдля отображения результатовQLabelдля результата проверки
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «Словарь» → «Найти анаграммы», «Случайные слова»
Вариант 14. Удалённый сервер голосования
Серверная часть (консольное приложение):
| Команда | Формат | Ответ |
|---|---|---|
| Проголосовать | VOTE:номер |
OK или ERROR:недопустимый вариант |
| Результаты | RESULTS |
RESULTS:вариант1:голоса1\|вариант2:голоса2\|... |
| Вопрос | QUESTION |
QUESTION:текст\|вариант1\|вариант2\|... |
| Сброс | RESET |
OK |
Сервер хранит предустановленный вопрос и варианты ответов.
Клиентская часть (GUI-приложение):
QLabelдля отображения вопроса- Группа
QRadioButtonдля вариантов ответа QPushButton«Голосовать»QProgressBarдля визуализации результатов голосованияQLabelдля количества голосов по каждому варианту
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «Голосование» → «Результаты», «Сброс»
Вариант 15. Удалённый обработчик текста
Серверная часть (консольное приложение):
| Команда | Формат | Ответ |
|---|---|---|
| Реверс | REVERSE:текст |
RESULT:текст |
| Верхний регистр | UPPER:текст |
RESULT:ТЕКСТ |
| Нижний регистр | LOWER:текст |
RESULT:текст |
| Количество слов | WORDS:текст |
RESULT:количество |
| Количество символов | CHARS:текст |
RESULT:количество |
Клиентская часть (GUI-приложение):
QTextEditдля ввода текстаQPushButton«Реверс», «ВЕРХНИЙ РЕГИСТР», «нижний регистр», «Считать слова», «Считать символы»QLabelдля результатаQLabel«Статус подключения»
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «Текст» → «Очистить», «Копировать результат»
Вариант 16. Удалённый конвертер чисел
Серверная часть (консольное приложение):
| Команда | Формат | Ответ |
|---|---|---|
| В двоичную | BIN:число |
RESULT:значение или ERROR:некорректное число |
| В восьмеричную | OCT:число |
RESULT:значение или ERROR |
| В шестнадцатеричную | HEX:число |
RESULT:значение или ERROR |
| В десятичную | DEC:число:база |
RESULT:значение или ERROR |
Клиентская часть (GUI-приложение):
QLineEditдля ввода числаQSpinBoxдля указания исходной системы счисления (2, 8, 10, 16)QPushButton«BIN», «OCT», «HEX», «DEC»QLabelдля результатаQLabel«Статус подключения»
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «Преобразование» → «Во все системы», «Очистить»
Вариант 17. Удалённый IP-калькулятор
Серверная часть (консольное приложение):
| Команда | Формат | Ответ |
|---|---|---|
| Подсеть | SUBNET:IP:маска |
SUBNET:сеть:broadcast:хосты или ERROR:некорректный ввод |
| Маска по префиксу | MASK:префикс |
MASK:маска или ERROR |
| Префикс по маске | PREFIX:маска |
PREFIX:значение или ERROR |
Клиентская часть (GUI-приложение):
QLineEditдля IP-адреса,QLineEditдля маски подсетиQPushButton«Вычислить подсеть»QLabelдля результата: адрес сети, broadcast, количество хостовQPushButton«Маска → Префикс», «Префикс → Маска»
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «Инструменты» → «Очистить», «Копировать результат»
Вариант 18. Удалённый чат-сервер
Серверная часть (консольное приложение):
| Команда | Формат | Ответ |
|---|---|---|
| Вход в чат | LOGIN:имя |
OK:имя или ERROR:имя занято |
| Отправить сообщение | MSG:текст |
(рассылка MSG:имя:текст всем клиентам) |
| Список пользователей | USERS |
USERS:имя1\|имя2\|... |
| История | HISTORY |
HISTORY:имя:текст\|имя:текст\|... (последние 50) |
Сервер рассылает сообщения всем подключённым клиентам и хранит историю сообщений.
Клиентская часть (GUI-приложение):
QTextEdit(только для чтения) — история чатаQLineEditдля ввода сообщенияQPushButton«Отправить»QListWidgetдля списка пользователей онлайн- При запуске — диалог ввода имени (LOGIN)
Меню: - «Соединение» → «Подключиться…» (с запросом имени), «Отключиться», «Выход» - «Чат» → «Очистить», «Пользователи»
Вариант 19. Удалённый планировщик задач
Серверная часть (консольное приложение):
| Команда | Формат | Ответ |
|---|---|---|
| Добавить задачу | ADD:задача:приоритет |
OK:номер |
| Список задач | LIST |
LIST:номер:задача:приоритет:статус\|... |
| Выполнить | DONE:номер |
OK или ERROR |
| Следующая задача | NEXT |
NEXT:задача:приоритет или EMPTY (высший приоритет) |
| Очистить | CLEAR |
OK |
Приоритеты: HIGH, MEDIUM, LOW.
Клиентская часть (GUI-приложение):
QListWidgetдля задач (цвет фона по приоритету: красный — HIGH, жёлтый — MEDIUM, зелёный — LOW)QLineEditдля ввода задачиQComboBoxдля выбора приоритета (Высокий, Средний, Низкий)QPushButton«Добавить», «Выполнить», «Следующая задача», «Очистить»
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «Задачи» → «Обновить», «Очистить выполненные»
Вариант 20. Удалённый сервер статистики
Серверная часть (консольное приложение):
| Команда | Формат | Ответ |
|---|---|---|
| Добавить число | ADD:число |
OK или ERROR:некорректное число |
| Статистика | STATS |
STATS:min:max:avg:count |
| Очистить | CLEAR |
OK |
| Сортировка | SORT |
SORT:число1:число2:... |
| Медиана | MEDIAN |
MEDIAN:значение |
Клиентская часть (GUI-приложение):
QLineEditдля ввода числаQPushButton«Добавить», «Статистика», «Очистить»QLabelдля min, max, avg, medianQListWidgetдля списка всех добавленных чиселQPushButton«Сортировка», «Медиана»
Меню: - «Соединение» → «Подключиться…», «Отключиться», «Выход» - «Данные» → «Статистика», «Очистить», «Сортировка»
Порядок выполнения
- Создать проект Qt Widgets Application для клиента (CMake, модули Core, Gui, Widgets, Network).
- Реализовать серверную часть: класс
CalculatorServerс обработкой командCALC,SQRT,POW,HISTORY,CLEAR. - Реализовать клиентскую часть: GUI с полями ввода, кнопками, отображением результата и истории.
- Запустить сервер, подключиться клиентом.
- Выполнить вычисления: бинарные операции,
√,^, деление на ноль (проверка обработки ошибки). - Запросить и обновить историю, очистить историю на сервере.
- Подключить второго клиента, убедиться, что истории разделены.
- Сохранить скриншоты (сервер + клиент).
Контрольные вопросы
- Что такое удалённый вызов процедур (RPC)? В чём его преимущества?
- Почему вся логика вычислений выполняется на сервере, а не на клиенте?
- Как устроен текстовый протокол обмена в данной работе? Какие его преимущества и недостатки?
- Как сервер различает запросы от разных клиентов?
- Что произойдёт, если сервер отправит ответ, а клиент уже отключился?
- Какие форматы сериализации данных применяются в реальных RPC-системах (JSON, XML, Protocol Buffers)?
- В чём разница между RPC и REST API?
- Как бы изменилась программа при добавлении аутентификации клиентов?
- Какие меры безопасности следует применять при разработке RPC-приложений?
Содержание отчёта
- Тема, цель и задание лабораторной работы.
- Описание разработанного протокола обмена (таблица команд и ответов).
- Текст программы (сервер и клиент) с комментариями.
- Скриншоты: серверная консоль, клиентский GUI (успешные вычисления, обработка ошибок, история).
- Ответы на контрольные вопросы.

