Кафедра ИСиТ УО ВГТУ
  • Специальности
    • Экономика электронного бизнеса
    • Информационные системы
    • Information Control Systems
  • Каталог
  • Сайт кафедры
  • Сервисы
    • GitLab
    • JupyterHub
    • Soft
  1. ИСиТ
  2. ПСП
  3. Практика
  4. Лаб. работа “Средства языка для организации работы в сети. Основные классы и интерфейсы реализации сетевого взаимодействия”
  • ИСиТ
    • АОС
      • Теория
        • Введение в операционные системы
        • Управление памятью
        • Управление процессами
        • Система ввода-вывода
        • Информационная безопасность
        • Виртуализация
      • Слайды
      • Практика
    • РВПсИПП
      • Теория
        • Настройка среды разработки для PHP
        • Введение в PHP
        • Работа с базами данных в PHP
        • Объектно-ориентированные возможности PHP
        • Разработка web-приложений на базе фреймворков
        • Основы Laravel
        • Шаблоны в Laravel
        • Модели и базы данных в Laravel
        • Формы и валидация в Laravel
        • Аутентификация и авторизация в Laravel
        • Создание REST API в Laravel
        • Работа с файлами и изображениями в Laravel
        • Тестирование и отладка в Laravel
        • Введение в фреймворк Symfony
        • Маршруты и контроллеры в Symfony
        • Шаблоны и Twig в Symfony
        • Формы и валидация в Symfony
        • Доступ к базам данных в Symfony
        • Аутентификация и авторизация в Symfony
        • Сервисы и зависимости в Symfony
        • Создание REST API в Symfony
        • Работа с файлами и медиа в Symfony
        • Сравнение и выбор фреймворка
        • Развертывание веб-приложения
      • Практика
        • Регистрация в JupyterHub
        • Лаб. работа “Основы PHP”
        • Лаб. работа “Массивы в PHP”
        • Лаб. работа “Создание веб-приложений с использованием Slim”
        • Лаб. работа 1 “Создание нового приложения Laravel”
        • Лаб. работа 2 “Добавление главной страницы и базовых маршрутов”
        • Лаб. работа 3 “Создание моделей, миграций и сидеров”
        • Лаб. работа 4 “Создание индексных страниц и пагинация”
        • Лаб. работа 5 “Создание форм для работы с сущностями”
        • Лаб. работа 6 “Работа с файлами (эмуляция S3-хранилища)”
        • Лаб. работа “Создание маршрутов в Laravel”
        • Лаб. работа “Работа с базами данных в Laravel”
        • Лаб. работа “Работа с формами в Laravel”
        • Лаб. работа “Аутентификация и авторизация в Laravel”
        • Лаб. работа “Работа с файлами в Laravel”
        • Лаб. работа “Тестирование и оптимизация в Laravel”
        • Лаб. работа “Создание REST API в Laravel”
        • Лаб. работа “Основы Symfony”
        • Лаб. работа “Шаблоны и представления в Symfony”
        • Лаб. работа “Работа с базами данных в Symfony”
        • Лаб. работа “Формы и аутентификация в Symfony”
        • Лаб. работа “Сервисы и зависимости в Symfony”
        • Лаб. работа “REST API в Symfony”
        • Лаб. работа “Работа с медиа контентом в Symfony”
        • Лаб. работа “Создание и развертывание проекта”
        • Расчетно-графическая работа: Разработка веб-приложения с использованием Laravel
          • Методические рекомендации по выполнению работы
          • Варианты заданий для расчетно-графической работы
    • ПСП
      • Теория
        • Введение
        • Протокол HTTP
        • Программирование с использованием сокетов
      • Практика
        • Программное обеспечение
        • Лаб. работа “Почтовые протоколы”
        • Лаб. работа “Протокол FTP”
        • Лаб. работа “Протокол HTTP”
        • Лаб. работа “Программирование сетевых приложений с использованием сокетов”
        • Лаб. работа “Обзор базовых конструкций и основных элементов языка”
        • Лаб. работа “Структурные элементы класса, методы взаимодействия объектов и организация наследования”
        • Лаб. работа “Типы исключительных ситуаций и процесс их обработки”
        • Лаб. работа “Потоки ввода/вывода и работа с файлами”
        • Лаб. работа “Организация потоков, параллельной обработки, синхронизации и распределённой обработки синхронизуемых участков кода”
        • Лаб. работа “Структурные механизмы языка программирования для реализации полиморфизма в программах”
        • Лаб. работа “Средства языка для организации работы в сети. Основные классы и интерфейсы реализации сетевого взаимодействия”
        • Лаб. работа “Библиотеки и средства внедрения визуальных компонент для организации GUI-интерфейсов пользователя. Обработка событий”
        • Лаб. работа “Концепция распределённой обработки данных и технологии удалённой обработки данных”
      • Темы курсовых проектов по дисциплине “Программирование сетевых приложений”
    • Компьютерные сети
      • Теория
        • Введение в компьютерные сети
        • Топологии сетей
        • Кодирование и мультиплексирование
        • Стеки протоколов
        • Адресация в компьютерных сетях
        • Система доменных имен (DNS)
        • Программирование с использованием сокетов
        • Введение в PHP
        • Протокол HTTP
        • Введение в компьютерные сети
      • Практика
        • Программное обеспечение
        • Регистрация в JupyterHub
        • Лаб. работа “Почтовые протоколы”
        • Лаб. работа “Протокол FTP”
        • Лаб. работа “Протокол HTTP”
        • Лаб. работа “Программирование сетевых приложений с использованием сокетов”
        • Лаб. работа “Основы PHP”
        • Лаб работа “Массивы в PHP”
    • РиОИИС
      • Слайды
      • Теория
        • Классификация оптимизационных задач
        • Генетические алгоритмы
        • Системы массового обслуживания
        • Теория игр
        • Машинное обучение
        • Глубокое обучение (Deep learning)
        • Основы функционального программирования
        • Основы программирования на Haskell
        • Введение в логическое программирование
        • Инференция и рассуждения в логическом программировании
        • Разработка экспертных систем
        • Интеллектуальные системы и их архитектура
        • Веб-скрэйпинг
        • Сбор данных с открытых API
      • Практика
        • JupyterHub
        • Лаб. работа “Основы программирования на Python”
        • Лаб. работа “Функции в Python”
        • Лаб. работа “Рекурсия в Python”
        • Лаб. работа “Итераторы в Python”
        • Лаб. работа “Методы одномерной оптимизации”
        • Лаб. работа “Методы многомерной оптимизации”
        • Лаб. работа “Линейное программирование”
        • Лаб. работа “Генетические алгоритмы”
        • Лаб. работа “Haskell”
        • Лаб. работа “Логическое программирование”
        • Лаб. работа “Сбор данных с помощью веб-скрейпинга”
        • Лаб. работа “Предобработка данных”
        • Лаб. работа “Машинное обучение: классификация”
        • Лаб. работа “Создание и обучение простейших нейронных сетей”
        • Лаб. работа “Системы массового обслуживания”
        • Лаб. работа “Обработка естественного языка”
        • Лаб. работа “Компьютерное зрение”
        • Лаб. работа “Нейросети и глубокое обучение”
    • КСКР
      • Практика
        • Лаб. работа “Одномерные и двумерные массивы в C#”
        • Лаб. работа “Обращение матриц в C#”
    • Системное программирование
      • Слайды
      • Слайды
      • Теория
        • Управление памятью в Windows
        • Файловые операции в Windows
        • Управление процессами в Windows
        • Графический интерфейс Windows
        • ОС Unix
      • Практика
        • Лаб. работа “Работа с динамической памятью в Windows”
        • Лаб. работа “Операции с файлами в Windows”
        • Лаб. работа “Управление процессами в Windows”
        • Лаб. работа “Работа с виртуальной машиной Linux”
        • Лаб. работа “Язык командного энтерпритатора Shell”
        • Лаб. работа “Работа с файлами в Linux”
        • Лаб. работа “Работа с процессами в Linux”
    • ИППРПО
      • Теория
      • Практика
        • Лаб. работа “Язык командного энтерпритатора Shell”
        • Лаб. работа “Управление процессами в Shell”
        • Лаб. работа “Управление файловой системой в Shell”
        • Лаб. работа “Управление пакетами в ОС Linux”
        • Лаб. работа “Сетевые инструменты в Linux”
        • Лаб. работа “Мониторинг и анализ системы Linux”
        • Лаб. работа “Основы Docker. Управление контейнерами”
        • Лаб. работа “Docker: Сети”
        • Лаб. работа "Docker: Образы"
        • Лаб. работа “Docker Compose: Управление многоконтейнерными приложениями”
        • Лаб. работа “CI/CD с GitLab”

Содержание

  • Цель работы
  • Теоретические сведения
    • Сетевой модуль Qt
    • Конфигурация CMake
    • QTcpServer — создание сервера
    • Обработка нового подключения
    • QTcpSocket — отправка и получение данных
    • QTcpSocket — подключение клиента
    • Механизм сигналов и слотов
  • Задание для выполнения
    • Требования к программе
    • Пример ожидаемого вывода
  • Индивидуальные задания
    • Вариант 1. Сервер времени
    • Вариант 2. Сетевой калькулятор
    • Вариант 3. Сервер-переворотчик
    • Вариант 4. Справочник DNS (имитация)
    • Вариант 5. TO-DO список
    • Вариант 6. Сервер погоды (имитация)
    • Вариант 7. Сервер конвертации валют
    • Вариант 8. Сервер генерации паролей
    • Вариант 9. Телефонный справочник
    • Вариант 10. Сервер логирования
    • Вариант 11. Хранилище ключей-значений
    • Вариант 12. Сервер анаграмм
    • Вариант 13. Сервер голосования
    • Вариант 14. Сервер системной информации
    • Вариант 15. Генератор случайных чисел
    • Вариант 16. Сервер чата (многоклиентский)
    • Вариант 17. Сервер файловых операций (имитация)
    • Вариант 18. Сервер конвертации чисел
    • Вариант 19. Сервер статистики текста
    • Вариант 20. Сервер анаграмм
  • Порядок выполнения
  • Контрольные вопросы
  • Содержание отчёта
  1. ИСиТ
  2. ПСП
  3. Практика
  4. Лаб. работа “Средства языка для организации работы в сети. Основные классы и интерфейсы реализации сетевого взаимодействия”

Лаб. работа “Средства языка для организации работы в сети. Основные классы и интерфейсы реализации сетевого взаимодействия”

Программирование сетевых приложений
Практика
Автор

Бизюк Андрей

Дата публикации

9 апреля 2026 г.

Цель работы

Изучить основные классы сетевого модуля Qt — QTcpServer и QTcpSocket. Освоить процесс установления TCP-соединения, а также асинхронную отправку и получение данных с помощью механизма сигналов и слотов (readyRead(), write()).

Теоретические сведения

Сетевой модуль Qt

Для работы с сетью в Qt используется модуль Qt Network. Основные классы:

Класс Назначение
QTcpServer TCP-сервер, принимающий входящие подключения
QTcpSocket TCP-сокет для установки соединения и обмена данными
QUdpSocket UDP-сокет для отправки датаграмм
QHostAddress IP-адрес
QNetworkInterface Информация о сетевых интерфейсах

Конфигурация CMake

find_package(Qt6 REQUIRED COMPONENTS Core Network)
target_link_libraries(Lab7 PRIVATE Qt6::Core Qt6::Network)

QTcpServer — создание сервера

QTcpServer* server = new QTcpServer(this);
if (!server->listen(QHostAddress::Any, 8080)) {
    qDebug() << "Ошибка запуска сервера:" << server->errorString();
    return;
}
connect(server, &QTcpServer::newConnection, this, &MyClass::onNewConnection);

Обработка нового подключения

void MyClass::onNewConnection() {
    QTcpSocket* client = server->nextPendingConnection();
    connect(client, &QTcpSocket::readyRead, this, &MyClass::onReadyRead);
    connect(client, &QTcpSocket::disconnected, client, &QTcpSocket::deleteLater);
    qDebug() << "Новое подключение:" << client->peerAddress().toString();
}

QTcpSocket — отправка и получение данных

// Отправка данных
void sendData(QTcpSocket* socket, const QString& data) {
    socket->write(data.toUtf8());
    socket->flush();
}

// Приём данных (асинхронный, через сигнал)
void MyClass::onReadyRead() {
    QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());
    QByteArray data = socket->readAll();
    qDebug() << "Получено:" << data;
}

QTcpSocket — подключение клиента

QTcpSocket* socket = new QTcpSocket(this);
connect(socket, &QTcpSocket::connected, this, &MyClass::onConnected);
connect(socket, &QTcpSocket::readyRead, this, &MyClass::onReadyRead);
connect(socket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::errorOccurred),
        this, &MyClass::onError);
socket->connectToHost("127.0.0.1", 8080);

Механизм сигналов и слотов

Сигналы и слоты — механизм Qt для асинхронного взаимодействия между объектами:

Сигналы и слоты Qt

Сигналы и слоты Qt
connect(отправитель, &Класс::сигнал, получатель, &Класс::слот);

Задание для выполнения

Разработать клиент-серверное приложение «Эхо-сервер» с использованием QTcpServer и QTcpSocket. Сервер принимает текстовые сообщения от клиента и возвращает их обратно (эхо). Поддерживается множество одновременных подключений.

Требования к программе

Сервер (консольное приложение):

  1. Создать класс EchoServer (наследник QObject):
    • поле: QTcpServer* server
    • метод start(int port) — запуск сервера на указанном порту, вывод: [Server] Запущен на порту <port>
    • слот onNewConnection() — принятие подключения, подключение сигналов readyRead и disconnected, вывод информации о подключившемся клиенте (IP и порт)
    • слот onReadyRead() — чтение данных от клиента, вывод: [<IP>:<порт>] <сообщение>, отправка эхо-ответа клиенту (префикс ECHO:)
    • слот onClientDisconnected() — вывод информации об отключении клиента
  2. Сервер должен поддерживать несколько одновременных клиентов (каждое подключение — отдельный QTcpSocket).

Клиент (консольное приложение):

  1. Создать класс EchoClient (наследник QObject):
    • поле: QTcpSocket* socket
    • метод connectToServer(const QString& host, int port) — подключение к серверу
    • метод send(const QString& message) — отправка сообщения
    • слот onConnected() — вывод: [OK] Подключен к серверу
    • слот onReadyRead() — вывод полученного эхо-ответа: [ECHO] <сообщение>
    • слот onDisconnected() — вывод: [INFO] Соединение закрыто
    • слот onError() — вывод ошибки
  2. В функции main() клиента:
    • Подключиться к серверу
    • В цикле while считывать строки с клавиатуры и отправлять их серверу
    • Команда quit — отключение от сервера

Пример ожидаемого вывода

Сервер:

[Server] Запущен на порту 8080
[+] Клиент подключен: 127.0.0.1:54321
[127.0.0.1:54321] Hello, Server!
[127.0.0.1:54321] How are you?
[-] Клиент отключен: 127.0.0.1:54321
[+] Клиент подключен: 127.0.0.1:54322
[127.0.0.1:54322] Another client here
[-] Клиент отключен: 127.0.0.1:54322

Клиент 1:

[OK] Подключен к серверу
> Hello, Server!
[ECHO] ECHO: Hello, Server!
> How are you?
[ECHO] ECHO: How are you?
> quit
[INFO] Соединение закрыто

Индивидуальные задания

Для каждого варианта разработать два консольных приложения на C++ с использованием Qt6 (QTcpServer, QTcpSocket, сигналы/слоты). Сервер поддерживает несколько одновременных клиентов. Обмен данными — текстовые команды по TCP (каждая команда завершается \n).

Вариант 1. Сервер времени

Протокол: команда TIME → ответ TIME:YYYY-MM-DD HH:MM:SS, команда DATE → ответ DATE:YYYY-MM-DD, команда ECHO:текст → ответ ECHO:текст. Сервер: TimeServer — QTcpServer, при получении команды возвращает соответствующий ответ. Поддержка нескольких клиентов. Клиент: TimeClient — QTcpSocket, текстовое меню: 1 — запросить время, 2 — запросить дату, 3 — эхо-сообщение, 0 — выход. Команда quit — отключение.

Вариант 2. Сетевой калькулятор

Протокол: CALC:операнд1 оператор операнд2 → RESULT: значение или ERROR: описание.

Пример: CALC:10 + 5 → RESULT: 15.

Сервер: CalcServer. Клиент: CalcClient — ввод выражений в формате операнд1 оператор операнд2.

Вариант 3. Сервер-переворотчик

Протокол: - REVERSE:текст → RESULT: перевёрнутый_текст - UPPER:текст → RESULT: ЗАГЛАВНЫЕ - LOWER:текст → RESULT: строчные

Сервер: TextServer. Клиент: TextClient — консольное меню (1 — перевернуть, 2 — в верхний регистр, 3 — в нижний регистр, 0 — выход).

Вариант 4. Справочник DNS (имитация)

Протокол: - LOOKUP:домен → IP: адрес или NOT_FOUND - ADD:домен:IP → OK или ERROR: уже_существует - LIST → нумерованный список записей (домен → IP)

Сервер: DNSServer — хранит std::map<QString, QString> с начальным набором записей. Клиент: DNSClient — консольное меню (1 — поиск, 2 — добавить, 3 — список, 0 — выход).

Вариант 5. TO-DO список

Протокол: - ADD:задача → OK: номер_задачи - DONE:номер → OK или ERROR: неверный_номер - LIST → нумерованный список задач - CLEAR → OK

Сервер: TodoServer — хранит список задач для каждого клиента отдельно. Клиент: TodoClient — консольное меню (1 — добавить, 2 — выполнить, 3 — список, 4 — очистить, 0 — выход).

Вариант 6. Сервер погоды (имитация)

Протокол: - WEATHER:город → TEMP: значение HUMIDITY: значение WIND: значение или ERROR: город_не_найден - CITIES → список доступных городов через запятую

Сервер: WeatherServer — хранит предзаполненные данные для 5–7 городов. Клиент: WeatherClient — консольное меню (1 — погода города, 2 — список городов, 0 — выход).

Вариант 7. Сервер конвертации валют

Протокол: - CONVERT:сумма:из:в → RESULT: значение или ERROR: неизвестная_валюта - RATES → список курсов (валюта → курс к базовой)

Сервер: CurrencyServer — хранит std::map<QString, double> курсов (USD, EUR, RUB, CNY и др.). Клиент: CurrencyClient — консольное меню (1 — конвертировать, 2 — список курсов, 0 — выход).

Вариант 8. Сервер генерации паролей

Протокол: - PASS:длина → PASSWORD: пароль (буквы + цифры) - PASS:длина:тип → PASSWORD: пароль, где тип: alpha / num / all (буквы+цифры+символы)

Сервер: PassServer. Клиент: PassClient — запрос длины и типа, вывод сгенерированного пароля.

Вариант 9. Телефонный справочник

Протокол: - FIND:имя → PHONE: номер или NOT_FOUND - ADD:имя:телефон → OK или ERROR: уже_существует - ALL → нумерованный список всех записей - DELETE:имя → OK или ERROR: не_найден

Сервер: PhoneServer — хранит std::map<QString, QString> с начальными записями. Клиент: PhoneClient — консольное меню (1 — найти, 2 — добавить, 3 — все записи, 4 — удалить, 0 — выход).

Вариант 10. Сервер логирования

Протокол: - LOG:уровень:сообщение → OK (уровень: INFO, WARN, ERROR) - GETLOG → содержимое журнала (все записи, по одной на строку) - CLEARLOG → OK

Сервер: LogServer — сохраняет записи в QVector<QString> и дополнительно в файл server.log. Клиент: LogClient — консольное меню (1 — записать, 2 — получить журнал, 3 — очистить, 0 — выход).

Вариант 11. Хранилище ключей-значений

Протокол: - SET:ключ:значение → OK - GET:ключ → VALUE: значение или NOT_FOUND - DEL:ключ → OK или ERROR: не_найден - KEYS → список ключей через запятую

Сервер: KVServer — хранит std::map<QString, QString>. Клиент: KVClient — консольное меню (1 — задать, 2 — получить, 3 — удалить, 4 — список ключей, 0 — выход).

Вариант 12. Сервер анаграмм

Протокол: ANAGRAM:слово → RESULT: анаграмма1, анаграмма2, ... или RESULT: нет_анаграмм.

Сервер: AnagramServer — содержит встроенный словарь слов (до 6 символов), находит все анаграммы. Клиент: AnagramClient — ввод слова, вывод найденных анаграмм.

Вариант 13. Сервер голосования

Протокол: - VOTE:номер → OK или ERROR: неверный_вариант (варианты 1–4) - RESULTS → RESULTS: вариант1:голоса, вариант2:голоса, вариант3:голоса, вариант4:голоса

Сервер: VoteServer — один опрос с 4 вариантами ответа, подсчёт голосов (QVector<int>). Клиент: VoteClient — отображение вариантов, ввод номера, просмотр результатов.

Вариант 14. Сервер системной информации

Протокол: - INFO → HOST: имя OS: система CPUS: число RAM: МБ - UPTIME → UPTIME: секунды - PING → PONG: timestamp

Сервер: InfoServer — использует QSysInfo, QHostInfo. Клиент: InfoClient — консольное меню (1 — информация, 2 — аптайм, 3 — пинг, 0 — выход).

Вариант 15. Генератор случайных чисел

Протокол: - RAND:min:max → RESULT: число - RANDS:min:max:количество → RESULTS: число1, число2, ...

Сервер: RandServer — использует QRandomGenerator. Клиент: RandClient — ввод диапазона и количества, вывод результатов.

Вариант 16. Сервер чата (многоклиентский)

Протокол: - LOGIN:имя → OK: имя или ERROR: имя_занято - MSG:текст → рассылка всем клиентам в формате [имя] текст - USERS → USERS: имя1, имя2, ...

Сервер: ChatServer — хранит список подключённых клиентов с именами, рассылает сообщения всем (QList<QTcpSocket*>). Клиент: ChatClient — отдельный поток или QSocketNotifier для приёма сообщений, ввод текста в основном потоке.

Вариант 17. Сервер файловых операций (имитация)

Протокол: - TOUCH:имя → OK или ERROR: уже_существует - LS → список файлов через запятую - RM:имя → OK или ERROR: не_найден - SIZE:имя → SIZE: байты или ERROR: не_найден

Сервер: FileServer — файловая система в памяти (std::map<QString, QByteArray>, размер — длина содержимого). Клиент: FileClient — консольное меню (1 — создать, 2 — список, 3 — удалить, 4 — размер, 0 — выход).

Вариант 18. Сервер конвертации чисел

Протокол: - BIN:число → RESULT: двоичное_представление - OCT:число → RESULT: восьмеричное_представление - HEX:число → RESULT: шестнадцатеричное_представление

Пример: BIN:42 → RESULT: 101010.

Сервер: ConvServer. Клиент: ConvClient — консольное меню (1 — BIN, 2 — OCT, 3 — HEX, 0 — выход).

Вариант 19. Сервер статистики текста

Протокол: STAT:текст → CHARS: n WORDS: n LINES: n.

Пример: STAT:Hello world → CHARS: 11 WORDS: 2 LINES: 1.

Сервер: StatServer — подсчитывает символы (без пробелов), слова и строки. Клиент: StatClient — ввод многострочного текста (пустая строка — отправка), вывод статистики.

Вариант 20. Сервер анаграмм

Протокол: ANAGRAM:слово → RESULT:анаграмма1,анаграмма2,... (все перестановки, слова до 6 символов), WORDS:длина → RESULT:слово1,слово2,... (случайные слова заданной длины), VALIDATE:слово → OK или NOT_IN_DICT. Сервер: AnagramServer — QTcpServer, хранит словарь (set), при ANAGRAM генерирует все перестановки и фильтрует по словарю. Клиент: AnagramClient — QTcpSocket, меню: 1 — найти анаграммы, 2 — случайные слова, 3 — проверить слово, 0 — выход.


Порядок выполнения

  1. Создать проект C++ в Qt Creator (CMake), подключить модуль Qt6::Core и Qt6::Network.
  2. Реализовать класс EchoServer с поддержкой нескольких клиентов.
  3. Реализовать класс EchoClient с консольным вводом.
  4. Запустить сервер, затем запустить два экземпляра клиента в разных терминалах.
  5. Убедиться, что оба клиента получают свои эхо-ответы, сервер корректно отображает все подключения и отключения.
  6. Скомпилировать, сохранить скриншоты (сервер + оба клиента).

Контрольные вопросы

  1. Какие классы модуля Qt Network использованы в работе? Каково их назначение?
  2. Какое преимущество даёт асинхронная работа с сокетами через сигналы и слоты по сравнению с синхронными вызовами?
  3. Как работает сигнал QTcpServer::newConnection? Что такое nextPendingConnection()?
  4. Почему необходимо вызывать deleteLater() при отключении клиента?
  5. Как метод qobject_cast<QTcpSocket*>(sender()) позволяет определить, от какого клиента пришли данные?
  6. В чём разница между QTcpSocket::write() и QTcpSocket::flush()?
  7. Что произойдёт, если клиент отправит данные быстрее, чем сервер успевает их обрабатывать?
  8. Как получить IP-адрес и порт подключённого клиента через QTcpSocket?

Содержание отчёта

  1. Тема, цель и задание лабораторной работы.
  2. Схема взаимодействия: сервер ↔︎ клиенты (с указанием сигналов и слотов).
  3. Текст программы (сервер и клиент) с комментариями.
  4. Скриншоты: сервер с двумя подключёнными клиентами, обмен сообщениями.
  5. Ответы на контрольные вопросы.
Наверх
Лаб. работа “Структурные механизмы языка программирования для реализации полиморфизма в программах”
Лаб. работа “Библиотеки и средства внедрения визуальных компонент для организации GUI-интерфейсов пользователя. Обработка событий”