клиент-сервер в QT | QTcpServer просто!

preview_player
Показать описание
В этом выпуске разберемся с клиент-серверными приложениями в Qt. Мы создадим клиент- серверный чат, в котором сообщения от каждого клиента будут приходить на сервер, а сервер будет рассылать эти сообщения всем подключенным клиентам. Мы рассмотрим работу сервера по протоколу TCP, научимся создавать и удалять сокеты, правильно формировать сообщения для отправки на сервер и клиент, принимать сообщения целиком и по частям, будем работать с классами потоковой передачи информации, контейнерами, дескрипторами, массивами байтов и все это в одном коротком ролике, как всегда с картинками, доступными понятными объяснениями и милыми пушистиками.

таймкоды:
00:00 - вступление
00:44 - начинаем писать сервер
01:24 - немного теории
03:50 - продолжаем писать сервер
04:41 - конструктор
05:02 - обработка подключений
05:50 - чтение сообщений
06:50 - отправление сообщений
07:30 - запуск сервера
07:40 - пишем клиент
10:34 - грамотная передача данных
13:58 - добавляем крутую фишку

#Qt #программирование #программныйКот
Рекомендации по теме
Комментарии
Автор

При каждом входящем подключении к серверу, указатель на новый сокет сохраняется в вектор Sockets, а при отключении клиента и формировании сигнала QTcpSocket::disconnected для этого сокета вызывается функция QTcpSocket::deleteLater, которая делает невалидным указатель на данный сокет в следующем лупе. При этом в векторе Sockets остается указатель на невалидный сокет, что при дальнейшей работе с оставшимися клиентами приведет к крешу сервера. Правильнее было бы сделать отдельный слот для обработки сигнала QTcpSocket::disconnected и в нем выполнять что то типа:
Sockets.erase(std::remove(Socket.begin(), Socket.end(), socket), Socket.end());
Socket->deleteLater();
Естественно, перед этим в слоте необходимо скастовать объект, возвращаемый sender() к типу QTcpSocket*.

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

Mr.Ahavzi
Автор

2:14 - небольшая поправка: не потому что 0 брать нельзя (то есть не может быть числа 0), а потому что в записи, например, 8 битной: 1000 0000 будет обозначать только 2**7, хотя бит 8, потому что первый бит - это 2**0, но в сумме, от 0 до 1111 1111 как раз и будет 2**8 чисел.

DadundddaD
Автор

Отличный монтаж и подача материала, продолжайте!

ravilizmailov
Автор

10:13 Сборка->Очистить, после этого пересобрать, обычно фиксит довольно много багов

ЕгорКрасный-ьг
Автор

ого. это прям топ. очень жаль что такой контент люди не ценят(

openFrimeTv
Автор

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

-USER_NAME
Автор

У Вас всегда самые классные и полезные видео по QT! Огромная просьба, когда-нибудь снимите видео по печати документов в QT. В том плане что есть QTextDocument class или как создать HTML документ, чтобы напечатать лист А4 и вывести в него информацию из программы. Очень актуальная тема у многих)

artyomgolenischev
Автор

вау, спасибо, это действительно полезно и интересно

МихаилБорисов-дя
Автор

Не знаю, актуально или нет, но чтоб не чистить папку вручную как на 10:00, в пункте Меню -> Сборка есть опция "Очистить". Она делает все, как вы сказали, "грамотно"

GuNStaRia
Автор

легендарное видео ! благодарны всей группой

ФёдорУрусов-дж
Автор

Спасибо за видео! Начиная с Qt 5.7 можно также проверять, все ли данные пришли, с помощью и

mariarudeyko
Автор

Замечательное видео, все понятно, четко и ясно. Все получилось, все работает. Спасибо.

nikert
Автор

Чтоб проект полностью пересобрать нужно:
Очистить его
Запустить QMake
И можно собирать заново)
Эта фигня происходит потому, что в qt генерируется куча дополнительных файлов, которых нет в обычных проектах на С++. И ради экономии времени сборки сам креатор не удаляет их перед новой сборкой)

KMkmkmkmkm-zy
Автор

Спасибо, долго не мог понять, помогло это видео. И желательно увеличить шрифт у IDE, не у всех 1080 мониторы)

Корыч
Автор

Здравствуйте! Спасибо за прекрасный пример! О том, почему пришлось удалить файлы сборки и пересобрать проект. Смею предположить, что qt запускает первым тот файл, который был создан и собран последним. А так как сначала мы сделали сервер, а потом клиент, то qt сначала запускает файл с клиентом. А для правильной работы клиент-серверного приложения у нас должен быть уже включен сервер на момент подключения клиента. Обошла данную ситуацию следующим образом: нажала сначала правой кнопкой мыши на сервер и запустила код (run), сервер вывел "start", потом уже нажала запуск для всего проекта (зеленая кнопка слева внизу). Простите, если что-то коряво объясняю, с qt только начала знакомиться, да и в принципе опыта программирования еще маловато.

МарияОрехова-шш
Автор

не, ну чисто гений!!
спасибо за видео!

Programscape
Автор

Насчет того, что data и nextBlockSize инициализируются мусором - разумеется, поля классов С++ всегда надо инициализировать вручную. Контейнеры можно инициализировать так: data = {};

DadundddaD
Автор

Отличное пояснение! Спасибо огромное! Я занимаюсь разработкой устройств в которых используются GSM модули. Работают по сути как клиенты. Вопрос!? Как выбрать хостинг для QT серверных приложений? Можете посоветовать?

ВладСперанский-ъв
Автор

Я хочу чтобы клиент при подключении к серверу получал от сервера дескриптор, который назначил сервер своему сокету на 5:10. как это сделать? С помощью механизма сигналов и слотов? как связать между собой два разных проекта с помощью этого механизма?

НастоящийКорабль
Автор

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

BlinCT