При каждом входящем подключении к серверу, указатель на новый сокет сохраняется в вектор Sockets, а при отключении клиента и формировании сигнала QTcpSocket::disconnected для этого сокета вызывается функция QTcpSocket::deleteLater, которая делает невалидным указатель на данный сокет в следующем лупе. При этом в векторе Sockets остается указатель на невалидный сокет, что при дальнейшей работе с оставшимися клиентами приведет к крешу сервера. Правильнее было бы сделать отдельный слот для обработки сигнала QTcpSocket::disconnected и в нем выполнять что то типа: Sockets.erase(std::remove(Socket.begin(), Socket.end(), socket), Socket.end()); Socket->deleteLater(); Естественно, перед этим в слоте необходимо скастовать объект, возвращаемый sender() к типу QTcpSocket*. ПС. Очень жаль, что на канале не выходят новые видео, подача контента довольно оригинальная, все по делу и без лишних слов. Надеюсь, что задержка с выходом видео временная и у автора будет снова возможность создавать контент.
Премного благодарен, НИГДЕ не мог найти именно вот эту функцию о которой ты написал, хотя перерыл достаточно много "ентернета ентого"! Вот как у меня выглядит слот (всё под копирку с твоих слов, просто в виде кода): void Server::slotClientDisconnected() { socket = (QTcpSocket*)sender(); Sockets.erase(std::remove(Sockets.begin(), Sockets.end(), socket), Sockets.end()); socket->deleteLater(); }
Чтоб проект полностью пересобрать нужно: Очистить его Запустить QMake И можно собирать заново) Эта фигня происходит потому, что в qt генерируется куча дополнительных файлов, которых нет в обычных проектах на С++. И ради экономии времени сборки сам креатор не удаляет их перед новой сборкой)
2:14 - небольшая поправка: не потому что 0 брать нельзя (то есть не может быть числа 0), а потому что в записи, например, 8 битной: 1000 0000 будет обозначать только 2**7, хотя бит 8, потому что первый бит - это 2**0, но в сумме, от 0 до 1111 1111 как раз и будет 2**8 чисел.
У Вас всегда самые классные и полезные видео по QT! Огромная просьба, когда-нибудь снимите видео по печати документов в QT. В том плане что есть QTextDocument class или как создать HTML документ, чтобы напечатать лист А4 и вывести в него информацию из программы. Очень актуальная тема у многих)
Да, кстати ! Присоединился бы к обсуждению темы работы в QT с документами. Если, к примеру, чтение и запись в txt файл проблем не вызывает, то вот как быть с документами Word'a ? Знаю, что записать в Word-овский файл можно с помощью HTML, но вот как быть с чтением этого файла для меня до сих пор остаётся загадкой...
Спасибо за видео! Начиная с Qt 5.7 можно также проверять, все ли данные пришли, с помощью QDataStream::startTransaction() и QDataStream::commitTransaction()
Здравствуйте! Спасибо за прекрасный пример! О том, почему пришлось удалить файлы сборки и пересобрать проект. Смею предположить, что qt запускает первым тот файл, который был создан и собран последним. А так как сначала мы сделали сервер, а потом клиент, то qt сначала запускает файл с клиентом. А для правильной работы клиент-серверного приложения у нас должен быть уже включен сервер на момент подключения клиента. Обошла данную ситуацию следующим образом: нажала сначала правой кнопкой мыши на сервер и запустила код (run), сервер вывел "start", потом уже нажала запуск для всего проекта (зеленая кнопка слева внизу). Простите, если что-то коряво объясняю, с qt только начала знакомиться, да и в принципе опыта программирования еще маловато.
Не знаю, актуально или нет, но чтоб не чистить папку вручную как на 10:00, в пункте Меню -> Сборка есть опция "Очистить". Она делает все, как вы сказали, "грамотно"
Насчет того, что data и nextBlockSize инициализируются мусором - разумеется, поля классов С++ всегда надо инициализировать вручную. Контейнеры можно инициализировать так: data = {};
Отличное пояснение! Спасибо огромное! Я занимаюсь разработкой устройств в которых используются GSM модули. Работают по сути как клиенты. Вопрос!? Как выбрать хостинг для QT серверных приложений? Можете посоветовать?
Отличный гайд, очень хорошо разобрано. Но есть вопрос, если это должно быть много поточным приложением, то есть под каждого нового клиента выделяется поток? Могли бы дать совет?
Нереально крутой видос!! есть один момент, сделал все как в видео про сборку с экзешника, заливаю на гит, скачиваю, а там такая ошибка: не удается продолжить выполнение кода поскольку система не обнаружила qt5widgets, и еще пара библиотек dll,
Всё очень круто, но есть один вопрос. Вы это всё сами из головы делали или по какой-то инструкции и в процессе были ошибки, которые вы исправляли по ходу написания?
Есть книга, где так же подробно описан подобный проект (хотя возможно автор именно от туда его и позаимствовал), называется "Qt 5.10. Профессиональное программирование на C++". Подобный проект находится на странице 555 Глава 39
Мне без разницы откуда. Главное, что информация дана, всё наглядно и по делу, а если этот пример еще и на какой-то книге основывается - вообще супер. Даниле спасибо за название книги, постараюсь найти, почитать.
Ещё вопросик) Я решил реализовать удалённое управление мышью и у меня возникла проблема задержки обработки получаемых сообщений. Суть в том, что если я сделаю резкое движение пальцем, то сервер начинает опаздывать с обработкой сообщения. Причём так, что если я пошлю новое сообщение, то он начнёт обрабатывать старое, а если не посылаю, то стек сообщений так и лежит, ожидая своей очереди. Код slodReadyRead() у меня аналогичный. Есть идеи, как подобное исправить?
Я хочу чтобы клиент при подключении к серверу получал от сервера дескриптор, который назначил сервер своему сокету на 5:10. как это сделать? С помощью механизма сигналов и слотов? как связать между собой два разных проекта с помощью этого механизма?
И еще малый вопрос, сервер же должен в бесконечном цыкле крутиться и постоянно быть запущенным. А у вас я что-то не увидел этого. Или я что то не допонял.
Когда клиент попытается установить соединение с сервером, на сервере возникает соответствующее событие/сигнал и вызывается функция incomingConnection. А при получении сообщения от клиента вызовется readyRead. Циклы здесь не нужны
Под капотом запускается. Эта функция виртуальная в QTcpServer. Засчёт полиморфизма будет использоваться реализация наиболее далекого потомка - в наш случае как раз класса Server.
Если один или несколько клиентов "отвалятся" от сервера во время передачи сообщения, то что произойдёт? Насколько я понимаю подтверждение приёма сообщения не происходит? Т.е. после восстановления соединения этот клиент уже не получит пропущенное сообщение? Сможет ли он вообще подключится, если сервер ещё не закроет его сокет? Каким образом сервер решает, что нужно закрыть сокет по тайм-ауту? И сколько времени составляет этот тайм-аут?
Может подскажет кто-нибудь как пофиксить. Сделал все один в один а incomingConnection почему-то не запускается, с чем это может дать связано? Может надо где-то слот поставить, или собрать как-то по-особенному. Папки с сборкой я удали и пересобрал перед запуском.
Есть вопрос. Как думаете, можно ли по TCP наладить обмен данными таким же образом между ПК и микроконтроллером STM32 ? Микроконтроллер подключен через сетевую карту Ethernet.
А что делать, если клиенту не известен IP адрес сервера? Просто известно, что он в той же подсети? Как реализовать широковещательный запрос от клиента в сеть, чтобы сервер ему ответил и дал свой адрес, чтобы потом клиент с этим адресом сервера работал?
@@programmcat неужели у Qt нет такой возможности? Это даже у SFML Network есть... Там клиент посылает по всей сети в режиме broadcast на нужный порт запрос и сервер может его обработать, получить адрес клиента и ему отправить свой адрес...
Сделал все тоже самое, аналогичный код, но клиент не подключается к серверу. Сервер как вывел 1 раз "start" так больше ничего не видит. Помогите пожалуйста; может кто сталкивался с такой проблемой? Клин и ребилд не помогли
Как фиксить проблему? Никак! У самого есть такая проблема. Например, сейчас я работаю над библиотекой для обработки данных. Библиотеки Qt не использую, Qt я использую только как IDE для С++. Для библиотеки я создал тестовую программу, где я тестирую работу функционала библиотеки. И после каждой второй-третьей сборки я удаляю директорию скомпилированной библиотеки. Как я вычитал на не одном десятке форумов, посвящённых Qt, это связанно с метаобъектным компилятором. Ты пишешь несколько классов, пишешь их методы, компилируешь. Qt сначала пропускает твою программу через свой метаобъектный компилятор. Так как компилятор С++ не понимает концепции сигналов и слотов, Q_OBJECT и т.д. - это вынужденная мера. После того, как метаобъектный компилятор переведёт твою программу на обычный С++, этот код передаётся уже обычному С++ компилятору из комплекта, который ты указываешь в настройках проекта. Суть: после первой компиляции создаётся метаобъектный файл твоей программы и если ты будешь изменять уже скомпилированные классы - будет находится этот объект в метаобъектном файле и изменятся. Если ты будешь создавать новые классы - они не будут находится и будет выдаваться ошибка. Нужно просто удалить всю директорию со скомпилированной программой (я предполагаю, что этот метаобъектный файл связан со всеми объектными файлами, которые компилируются). Тогда при компиляции будет создаваться новый метаобъектный файл и ошибок не будет. Почему так? Не знаю... Может быть так только на Винде, а на других системах такого нет. Может эту ошибку не могут пофиксить из-за секретных технологий работы этого самого метаобъектного компилятора (мы просто чего-то не знаем). По-моему, решение я вычитал как раз на официальном форуме Qt поддержки, что нужно просто удалять скомпилированную директорию. Лично мне это не мешает. По поводу контента: как всегда лучший. Вот в этой теме я сам не разбираюсь, но было всё понятно. Другое дело, что кода почти не видно. Он на половину ширины. Для зума можно использовать комбинацию Ctrl++ (это так, на будущее). Я поддерживаю развитие твоего контента и контента по Qt. Я, кстати, знаю, почему некоторые не хотят изучать Qt. Дизайн IDE устаревший. Я бы это назвал "Привет, 2001". Я три раза искал другие IDE, которые позволят использовать Qt библиотеки, но это так заморочено... Я решил поискать темы для Qt. И нашёл. Теперь в моём Qt установлена тема "One monokai", которая стоит у меня в VS Code. Для меня это лучшая тема! У меня есть совет: сними ролик, как искать темы для Qt на ГитХабе, какие файлы нужны (их два на одну тему), куда устанавливать эти файлы и как переключать темы в Qt. Если ты снимешь такой ролик, программисты подумают над дизайном Qt и перестанут считать его устаревшим, что может привести к популяризации Qt и твоего канала.
Спасибо! До метода додумался сам где-то полгода назад, когда несколько дней не мог понять, почему не работает рабочий код. Всегда считал что должен быть другой выход, на форумах ничего найти не мог подобного ))
@Eugene Я даже расширения ставил. У меня он всё равно все подключаемые библиотеки подчёркивает и кажет, что у меня их нет. Так ошибкой он считает любой метод, который я пытаюсь использовать. Это во-первых. А во-вторых, всё равно ведь нужно открыть Qt и там собирать приложения. В VSCode нет даже расширения для qmake и метаобъектного компилятора Qt, а CMake не решает проблему с тем же метаобъектным компилятором. Так зачем писать код в VSCode потом переключаться на Qt и собирать программу? Легче, когда всё в одном. Теперь, когда я настроил вид и тему Qt, мне будет приятнее им пользоваться. Вот если использовать Qt при написании программ на Питоне, тут всё элементарно. Скачал PyQt через pip и спокойно пишешь себе код. Никаких проблем. У Вас может и работает, не спорю. Но у меня нет.
@Eugene Да. Я ещё раз перечитал. Я неправильно понял. Объясняю. Я Visual Studio не рассматриваю, так как у него нет версии для Линукса. Я разрабатываю программы одновременно для двух систем и на двух системах. Да и лично у меня он (VS) в базовой комплектации занимал больше места, чем Qt, и после запуска требует больше оперативки. У Вас может быть по другому. Почему я сравниваю простой редактор и полноценную IDE? Потому что для написания простых библиотек или консольных приложений на С++ мне достаточно простого редактора кода. И для сборки проектов я пишу собственные makefiles. Мне так удобнее. Для этого мне не нужны мощности Qt. Qt я использую только для написания графических приложения. Также я немного пишу на Питоне. Для него мне с головой хватает возможностей редактора кода. Да, я пляшу с компиляторами и прочая, как Вы пишете. Пускай это не проще, но мне так удобнее. Однако если бы Visual Studio был бы на Линуксе, я бы с радостью им бы пользовался. Так как я пользуюсь обеими системами (такие обстоятельства, по другому пока не могу), мне приходится пользоваться кроссплатформенными решениями. Поэтому я использую и Qt, и VS Code. Всё зависит от поставленных задач и проекта. В любом случае, вопросы "чем пользоваться?" и "как пользоваться?" - это вкусовщина. Каждый останется при своём мнении.
@Eugene Я, кстати вспомнил главную причину, почему я им не хочу пользоваться. Когда VS создаёт проект, там создаётся куча лишних файлов, которые нужны только IDE. В то время, когда нужно написать простую программу, можно создать один или пару файлов проекта и самому его скомпилировать. Указав нужный ключ (-s), конечный экзешник будет весить сотню килобайт, без него программа весит 3 МБ. При написании программ на VS, её нужно сначала как-то настроить, чтобы она компилировала лёгкие экзешники, иначе все будут весить по 3 МБ. Да и в целом он медленнее компилирует. Есть одна вещь в VS, от которой у меня сильно подгарает. Это его отношение к массивам. Точнее, его компилятора. Я просто не могу писать программы с использованием массивов на VS. У него используется свой компилятор MSVS, который я всем своим духом не переношу. Как только я где-то вижу или слышу этот компилятор - меня начинает тошнить. А поменять на свой - НЕЛЬЗЯ! Я пользуюсь компилятором TDM-GCC. Как по мне он самый лучший. Я пользовался большим количеством IDE. Я искал хорошее решение. И все при создании проекта создают кучу лишних не нужных файлов проекту. Они нужны только IDE. Но есть одно исключение - Qt. Только одна эта IDE не создаёт ничего лишнего: только файлы с кодом и .pro-файл (аналог makefile). Вывод: из-за отсутствия кроссплатформенности, создания кучи лишних файлов (не пойми для чего нужных), невозможности изменить компилятор и просто тяжеловесности я не пользуюсь этой IDE и не буду пользоваться. Я передумаю только тогда, когда появится возможность менять компилятор и устанавливать IDE на линукс.
@Eugene А я и не утверждал, что знаю студию. Как указать в VS компилировать релиз я не нашёл. Там было просто "собрать проект" и после сборки он весит несколько МБ. Процесс сборки программ я знаю. Я про это и не говорил. Когда создаётся проект, вместе с кодом создаётся несколько директорий с ненужными проекту файлами. Например, когда я пользовался IDE от JatBrains, там всегда создавалась директория .idea . Я про это говорил. В VSCode создаётся папка .vscode в которой хранятся файлы настроек .json (если менять настройки редактора). VS создаёт файлы, которые не участвуют в процессе компиляции. Когда Вы нажимаете кнопку "открыть проект", появляется окно, в котором Вы выбираете проект, и там есть один файл, который служит только для открытия выбранного проекта в IDE и не для чего больше. Для чего нужны остальные файлы я не знаю. В других IDE таких файлов нет. Про папку с объектными файлами я ничего не говорил. Да, есть стандарт компилятор языков С/С++, но MSVS не придерживается этого стандарта. Он его нарушает. Так говорят на всех форумах, которые я читаю. Если рассматривать ситуацию конкретно про массивы, то я не могу указать не константный размер массива. Я должен передать или число или переменную с ключевым словом const, иначе программа не скомпилируется. И если так поступить - нельзя написать такую функцию, чтобы пользователь сам вводил размер массива. Это всё было больше года назад, когда я только начинал изучать программирование. У меня была лабораторка с заданием по массивам. Пользователь должен был сам ввести размер массива, после чего должна была быть выделена память под массив такого объёма, который укажет пользователь. У меня в VS выдавалась ошибка, что размер массива должен быть константым. Я тогда перешёл на DEV-C++ и там этот же код скомпилировался и заработал без ошибок. Как я потом вычитал, это так работает их компилятор. В советах на форуме было: поменять компилятор. Так что не нужно переводить стрелки: MSVS написан не по стандарту компиляторов и нарушает его. Ссылки дать не могу - ютуб удаляет комментарии со ссылками. В любом случае, это было 1 год и 2 месяца назад. С тех пор я не пользовался Visual Studio и осталось о нём негативные воспоминания. Я изучаю программирование только полтора года, а с VS я работал пару дней. Из-за его компилятора я не мог писать программы и пришлось искать другое IDE. Я не спорю, что Вы знаете больше меня. Но за последний год я много нужных знаний получил. Я описал две объективные проблемы для меня. Для Вас они могут быть и не объективны. Я приводил аргументы связанные только с IDE, а не с компилятором и тому прочим, поэтому не нужно говорить, что я не знаю, как работает компиляция, линковка и тому прочее. Но я мог просто неправильно выразиться на счёт лишних файлов и Вы могли меня не правильно понять. Я привёл два своих аргумента: кроссплатформенность и компилятор. Думаю, обсуждение сравнения Qt и VS можно закрыть. Мне всё равно больше нечего добавить. Если хотите, можете считать, что я не разбираюсь в VS. Тема не посвящена VS, а Qt. В нём-то я хорошо разбираюсь.
При каждом входящем подключении к серверу, указатель на новый сокет сохраняется в вектор Sockets, а при отключении клиента и формировании сигнала QTcpSocket::disconnected для этого сокета вызывается функция QTcpSocket::deleteLater, которая делает невалидным указатель на данный сокет в следующем лупе. При этом в векторе Sockets остается указатель на невалидный сокет, что при дальнейшей работе с оставшимися клиентами приведет к крешу сервера. Правильнее было бы сделать отдельный слот для обработки сигнала QTcpSocket::disconnected и в нем выполнять что то типа:
Sockets.erase(std::remove(Socket.begin(), Socket.end(), socket), Socket.end());
Socket->deleteLater();
Естественно, перед этим в слоте необходимо скастовать объект, возвращаемый sender() к типу QTcpSocket*.
ПС. Очень жаль, что на канале не выходят новые видео, подача контента довольно оригинальная, все по делу и без лишних слов. Надеюсь, что задержка с выходом видео временная и у автора будет снова возможность создавать контент.
Премного благодарен, НИГДЕ не мог найти именно вот эту функцию о которой ты написал, хотя перерыл достаточно много "ентернета ентого"!
Вот как у меня выглядит слот (всё под копирку с твоих слов, просто в виде кода):
void Server::slotClientDisconnected()
{
socket = (QTcpSocket*)sender();
Sockets.erase(std::remove(Sockets.begin(), Sockets.end(), socket), Sockets.end());
socket->deleteLater();
}
ого. это прям топ. очень жаль что такой контент люди не ценят(
Спасибо
Согласен, отличные уроки просто, я аж вспотел ))))
@@programmcat друг не поможешь добавить передачу файлов в чат или картинок, очень надо просто
@@АлиСаад-щ5ч принцип такой-же
@@programmcat а можно поподробнее узнать. Нужно вставлять картинку в сам textBrowser при нажатии на кнопку или как ?
Чтоб проект полностью пересобрать нужно:
Очистить его
Запустить QMake
И можно собирать заново)
Эта фигня происходит потому, что в qt генерируется куча дополнительных файлов, которых нет в обычных проектах на С++. И ради экономии времени сборки сам креатор не удаляет их перед новой сборкой)
Вот вот .По методу величайшего казахского миллиардера Киосаки , простым языком о сложном. Спасибо за видео 👍
Отличный монтаж и подача материала, продолжайте!
Спасибо за поддержку, надеюсь когда-нибудь выйти на монетизацию 😃 Qt что-то не особо заходит
2:14 - небольшая поправка: не потому что 0 брать нельзя (то есть не может быть числа 0), а потому что в записи, например, 8 битной: 1000 0000 будет обозначать только 2**7, хотя бит 8, потому что первый бит - это 2**0, но в сумме, от 0 до 1111 1111 как раз и будет 2**8 чисел.
Спасибо за твой труд!
10:13 Сборка->Очистить, после этого пересобрать, обычно фиксит довольно много багов
У Вас всегда самые классные и полезные видео по QT! Огромная просьба, когда-нибудь снимите видео по печати документов в QT. В том плане что есть QTextDocument class или как создать HTML документ, чтобы напечатать лист А4 и вывести в него информацию из программы. Очень актуальная тема у многих)
Хорошо👍
Да, кстати ! Присоединился бы к обсуждению темы работы в QT с документами. Если, к примеру, чтение и запись в txt файл проблем не вызывает, то вот как быть с документами Word'a ? Знаю, что записать в Word-овский файл можно с помощью HTML, но вот как быть с чтением этого файла для меня до сих пор остаётся загадкой...
@@dimongnezdilov3267 погугли библиотеку для плюсов для работы с вордом.
@@КириллГусарев-р5х спасибо за совет ))
Замечательное видео, все понятно, четко и ясно. Все получилось, все работает. Спасибо.
легендарное видео ! благодарны всей группой
Спасибо за видео! Начиная с Qt 5.7 можно также проверять, все ли данные пришли, с помощью QDataStream::startTransaction() и QDataStream::commitTransaction()
вау , спасибо , это действительно полезно и интересно
Лайк, подписка))
Здравствуйте! Спасибо за прекрасный пример! О том, почему пришлось удалить файлы сборки и пересобрать проект. Смею предположить, что qt запускает первым тот файл, который был создан и собран последним. А так как сначала мы сделали сервер, а потом клиент, то qt сначала запускает файл с клиентом. А для правильной работы клиент-серверного приложения у нас должен быть уже включен сервер на момент подключения клиента. Обошла данную ситуацию следующим образом: нажала сначала правой кнопкой мыши на сервер и запустила код (run), сервер вывел "start", потом уже нажала запуск для всего проекта (зеленая кнопка слева внизу). Простите, если что-то коряво объясняю, с qt только начала знакомиться, да и в принципе опыта программирования еще маловато.
Спасибо!
не, ну чисто гений!!
спасибо за видео!
Спасибо, долго не мог понять, помогло это видео. И желательно увеличить шрифт у IDE, не у всех 1080 мониторы)
Не знаю, актуально или нет, но чтоб не чистить папку вручную как на 10:00, в пункте Меню -> Сборка есть опция "Очистить". Она делает все, как вы сказали, "грамотно"
Огонь!!!!
Просто спасибо!
Спасибо тебе большое! Очень помог! 😊
Видео шикарное
Активное ожидание напрягает, конечно
Ты лучший)
Насчет того, что data и nextBlockSize инициализируются мусором - разумеется, поля классов С++ всегда надо инициализировать вручную. Контейнеры можно инициализировать так: data = {};
Красавчик !
Круто, очень помогло!
Отличное пояснение! Спасибо огромное! Я занимаюсь разработкой устройств в которых используются GSM модули. Работают по сути как клиенты. Вопрос!? Как выбрать хостинг для QT серверных приложений? Можете посоветовать?
Всё хорошо, только очень мелкий шрифт в IDE. Спасибо за урок!
Вы с телефона смотрите?
@@programmcat С ноутбука, монитор 13''
У меня со шрифтом всё идеально
Спасибо!
Отличный ролик, но очень медленно говорите, шутка, на 0.25 не могу уследить, за кодом :(
В любом случае, спасибо, очень помогло.
О у меня 2 года назад почти такое же было задание на собеседовании)
Мне сегодня дали похожее тестовое задание - надо отправлять файлы по TCP/UDP с одной проги в другую
Отличный гайд, очень хорошо разобрано. Но есть вопрос, если это должно быть много поточным приложением, то есть под каждого нового клиента выделяется поток? Могли бы дать совет?
исходники бы оставил >
спасибо
Нереально крутой видос!!
есть один момент, сделал все как в видео про сборку с экзешника, заливаю на гит, скачиваю, а там такая ошибка: не удается продолжить выполнение кода поскольку система не обнаружила qt5widgets, и еще пара библиотек dll,
Спасибо за ролик
А сервер может каким-то образом понять что подключение было потеряно?
Всё очень круто, но есть один вопрос. Вы это всё сами из головы делали или по какой-то инструкции и в процессе были ошибки, которые вы исправляли по ходу написания?
Есть книга, где так же подробно описан подобный проект (хотя возможно автор именно от туда его и позаимствовал), называется "Qt 5.10. Профессиональное программирование на C++". Подобный проект находится на странице 555 Глава 39
Мне без разницы откуда. Главное, что информация дана, всё наглядно и по делу, а если этот пример еще и на какой-то книге основывается - вообще супер. Даниле спасибо за название книги, постараюсь найти, почитать.
@@МарияОрехова-ш4ш твоё мнение мне очень важно. Держи в курсе.
Ещё вопросик)
Я решил реализовать удалённое управление мышью и у меня возникла проблема задержки обработки получаемых сообщений.
Суть в том, что если я сделаю резкое движение пальцем, то сервер начинает опаздывать с обработкой сообщения. Причём так, что если я пошлю новое сообщение, то он начнёт обрабатывать старое, а если не посылаю, то стек сообщений так и лежит, ожидая своей очереди. Код slodReadyRead() у меня аналогичный. Есть идеи, как подобное исправить?
Да, нужно использовать другой протокол
Мб UDP вместо TCP заюзать?
А возможно организовать модель клиент-сервер в рамках нелокальной сети (на разных устройствах, не подключенных к одной сети)? Заранее спасибо)
Ну таким же образом. Надо только IP в обеих программах указать другой.
А почему размер блока всегда в 2 раза больше того, что мы отправляем?
Я хочу чтобы клиент при подключении к серверу получал от сервера дескриптор, который назначил сервер своему сокету на 5:10. как это сделать? С помощью механизма сигналов и слотов? как связать между собой два разных проекта с помощью этого механизма?
И еще малый вопрос, сервер же должен в бесконечном цыкле крутиться и постоянно быть запущенным. А у вас я что-то не увидел этого. Или я что то не допонял.
Когда клиент попытается установить соединение с сервером, на сервере возникает соответствующее событие/сигнал и вызывается функция incomingConnection. А при получении сообщения от клиента вызовется readyRead. Циклы здесь не нужны
Может быть я что-то не понимаю, но где и в какой момент вызывается incommingConnection?
Под капотом запускается. Эта функция виртуальная в QTcpServer. Засчёт полиморфизма будет использоваться реализация наиболее далекого потомка - в наш случае как раз класса Server.
а могли бы показать как наладить передачу картинок?
Если один или несколько клиентов "отвалятся" от сервера во время передачи сообщения, то что произойдёт? Насколько я понимаю подтверждение приёма сообщения не происходит? Т.е. после восстановления соединения этот клиент уже не получит пропущенное сообщение? Сможет ли он вообще подключится, если сервер ещё не закроет его сокет? Каким образом сервер решает, что нужно закрыть сокет по тайм-ауту? И сколько времени составляет этот тайм-аут?
Не говоря уже о проверке принимаемых сообщений, чтобы избежать возможных эксплойтов.
Слишком много вопросов задаёшь
Видео топ!
Слушай, а что за qintptr и зачем он тут? 5 секунд гугления мне не помогло
Это тип данных, целое положительное
А зачем гуглить, если можно навести мышь на этот тип и появится подсказка? о_О😶🤲
Или нажать ПКМ -> Перейти к реализации.
Написал код сервера в QT 6.2. Сразу выдает error и падает с ошибкой. 10я Windows. Код проверил 3 раза, совпадает вплоть до последнего значка.
Такая же штука. Нашли решение?
Может подскажет кто-нибудь как пофиксить. Сделал все один в один а incomingConnection почему-то не запускается, с чем это может дать связано? Может надо где-то слот поставить, или собрать как-то по-особенному. Папки с сборкой я удали и пересобрал перед запуском.
Получается что просто не может клиент подключиться к серверу
@@ДаниилБуцкий-ш5ъ Такая же проблема, решил?
Всё бы хорошо но очень маленький шрифт, очень тяжело разглядеть
Попробуй посмотреть с компьютера, говорят помогает
@@programmcat да я с компа и смотрю мб монитор маленький
Есть у кого-нибудь код полностью всей этой штуки?
Есть вопрос. Как думаете, можно ли по TCP наладить обмен данными таким же образом между ПК и микроконтроллером STM32 ? Микроконтроллер подключен через сетевую карту Ethernet.
Не вижу препятствий для этого
Сервер выводит только "start" и всё, хотя всё написано аналогично. Подскажите как пофиксить?
Слот incomingConnection и его аргумент нужно писать как в видео, это override.
з вектора Sockets треба видаляти укаватель на сокет коли він закривається
А что делать, если клиенту не известен IP адрес сервера? Просто известно, что он в той же подсети? Как реализовать широковещательный запрос от клиента в сеть, чтобы сервер ему ответил и дал свой адрес, чтобы потом клиент с этим адресом сервера работал?
Никак
@@programmcat неужели у Qt нет такой возможности? Это даже у SFML Network есть... Там клиент посылает по всей сети в режиме broadcast на нужный порт запрос и сервер может его обработать, получить адрес клиента и ему отправить свой адрес...
Сделал все тоже самое, аналогичный код, но клиент не подключается к серверу. Сервер как вывел 1 раз "start" так больше ничего не видит. Помогите пожалуйста; может кто сталкивался с такой проблемой? Клин и ребилд не помогли
Почему-то приложение каждый раз выбирает новый порт, а не указаный 2323
Я просто по невнимательности ставил порт в ифе через запятую после listen(). Всё работает
@@idodoqdo5783 У меня такая же ошибка, только всё правильно написано, как пофиксить?
@@dmitriyalimov3475 Такая же проблема, нашел решение?
ти не показав де ти викликав слот incomingConnection()...
музыка сильно мешает :(
Могу ли я кому нибудь раздать клиент, и чатиться на разных машинах
да
в локальной сети только, с интернетом по другому работает
@@programmcat раздается папка с релизом правильно понимаю?)
@@dashitsybikzhapov9850 ruclips.net/video/F9ihThZPUvc/видео.html
@@programmcat А как сделать так, чтобы общение было через интернет?
Как фиксить проблему? Никак! У самого есть такая проблема. Например, сейчас я работаю над библиотекой для обработки данных. Библиотеки Qt не использую, Qt я использую только как IDE для С++. Для библиотеки я создал тестовую программу, где я тестирую работу функционала библиотеки. И после каждой второй-третьей сборки я удаляю директорию скомпилированной библиотеки. Как я вычитал на не одном десятке форумов, посвящённых Qt, это связанно с метаобъектным компилятором. Ты пишешь несколько классов, пишешь их методы, компилируешь. Qt сначала пропускает твою программу через свой метаобъектный компилятор. Так как компилятор С++ не понимает концепции сигналов и слотов, Q_OBJECT и т.д. - это вынужденная мера. После того, как метаобъектный компилятор переведёт твою программу на обычный С++, этот код передаётся уже обычному С++ компилятору из комплекта, который ты указываешь в настройках проекта. Суть: после первой компиляции создаётся метаобъектный файл твоей программы и если ты будешь изменять уже скомпилированные классы - будет находится этот объект в метаобъектном файле и изменятся. Если ты будешь создавать новые классы - они не будут находится и будет выдаваться ошибка. Нужно просто удалить всю директорию со скомпилированной программой (я предполагаю, что этот метаобъектный файл связан со всеми объектными файлами, которые компилируются). Тогда при компиляции будет создаваться новый метаобъектный файл и ошибок не будет. Почему так? Не знаю... Может быть так только на Винде, а на других системах такого нет. Может эту ошибку не могут пофиксить из-за секретных технологий работы этого самого метаобъектного компилятора (мы просто чего-то не знаем). По-моему, решение я вычитал как раз на официальном форуме Qt поддержки, что нужно просто удалять скомпилированную директорию.
Лично мне это не мешает.
По поводу контента: как всегда лучший. Вот в этой теме я сам не разбираюсь, но было всё понятно. Другое дело, что кода почти не видно. Он на половину ширины. Для зума можно использовать комбинацию Ctrl++ (это так, на будущее). Я поддерживаю развитие твоего контента и контента по Qt.
Я, кстати, знаю, почему некоторые не хотят изучать Qt. Дизайн IDE устаревший. Я бы это назвал "Привет, 2001". Я три раза искал другие IDE, которые позволят использовать Qt библиотеки, но это так заморочено... Я решил поискать темы для Qt. И нашёл. Теперь в моём Qt установлена тема "One monokai", которая стоит у меня в VS Code. Для меня это лучшая тема! У меня есть совет: сними ролик, как искать темы для Qt на ГитХабе, какие файлы нужны (их два на одну тему), куда устанавливать эти файлы и как переключать темы в Qt. Если ты снимешь такой ролик, программисты подумают над дизайном Qt и перестанут считать его устаревшим, что может привести к популяризации Qt и твоего канала.
Спасибо! До метода додумался сам где-то полгода назад, когда несколько дней не мог понять, почему не работает рабочий код. Всегда считал что должен быть другой выход, на форумах ничего найти не мог подобного ))
@Eugene Я даже расширения ставил. У меня он всё равно все подключаемые библиотеки подчёркивает и кажет, что у меня их нет. Так ошибкой он считает любой метод, который я пытаюсь использовать. Это во-первых. А во-вторых, всё равно ведь нужно открыть Qt и там собирать приложения. В VSCode нет даже расширения для qmake и метаобъектного компилятора Qt, а CMake не решает проблему с тем же метаобъектным компилятором. Так зачем писать код в VSCode потом переключаться на Qt и собирать программу? Легче, когда всё в одном. Теперь, когда я настроил вид и тему Qt, мне будет приятнее им пользоваться. Вот если использовать Qt при написании программ на Питоне, тут всё элементарно. Скачал PyQt через pip и спокойно пишешь себе код. Никаких проблем.
У Вас может и работает, не спорю. Но у меня нет.
@Eugene Да. Я ещё раз перечитал. Я неправильно понял. Объясняю. Я Visual Studio не рассматриваю, так как у него нет версии для Линукса. Я разрабатываю программы одновременно для двух систем и на двух системах. Да и лично у меня он (VS) в базовой комплектации занимал больше места, чем Qt, и после запуска требует больше оперативки. У Вас может быть по другому. Почему я сравниваю простой редактор и полноценную IDE? Потому что для написания простых библиотек или консольных приложений на С++ мне достаточно простого редактора кода. И для сборки проектов я пишу собственные makefiles. Мне так удобнее. Для этого мне не нужны мощности Qt. Qt я использую только для написания графических приложения. Также я немного пишу на Питоне. Для него мне с головой хватает возможностей редактора кода. Да, я пляшу с компиляторами и прочая, как Вы пишете. Пускай это не проще, но мне так удобнее.
Однако если бы Visual Studio был бы на Линуксе, я бы с радостью им бы пользовался. Так как я пользуюсь обеими системами (такие обстоятельства, по другому пока не могу), мне приходится пользоваться кроссплатформенными решениями. Поэтому я использую и Qt, и VS Code. Всё зависит от поставленных задач и проекта.
В любом случае, вопросы "чем пользоваться?" и "как пользоваться?" - это вкусовщина. Каждый останется при своём мнении.
@Eugene Я, кстати вспомнил главную причину, почему я им не хочу пользоваться. Когда VS создаёт проект, там создаётся куча лишних файлов, которые нужны только IDE. В то время, когда нужно написать простую программу, можно создать один или пару файлов проекта и самому его скомпилировать. Указав нужный ключ (-s), конечный экзешник будет весить сотню килобайт, без него программа весит 3 МБ. При написании программ на VS, её нужно сначала как-то настроить, чтобы она компилировала лёгкие экзешники, иначе все будут весить по 3 МБ. Да и в целом он медленнее компилирует.
Есть одна вещь в VS, от которой у меня сильно подгарает. Это его отношение к массивам. Точнее, его компилятора. Я просто не могу писать программы с использованием массивов на VS. У него используется свой компилятор MSVS, который я всем своим духом не переношу. Как только я где-то вижу или слышу этот компилятор - меня начинает тошнить. А поменять на свой - НЕЛЬЗЯ! Я пользуюсь компилятором TDM-GCC. Как по мне он самый лучший.
Я пользовался большим количеством IDE. Я искал хорошее решение. И все при создании проекта создают кучу лишних не нужных файлов проекту. Они нужны только IDE. Но есть одно исключение - Qt. Только одна эта IDE не создаёт ничего лишнего: только файлы с кодом и .pro-файл (аналог makefile).
Вывод: из-за отсутствия кроссплатформенности, создания кучи лишних файлов (не пойми для чего нужных), невозможности изменить компилятор и просто тяжеловесности я не пользуюсь этой IDE и не буду пользоваться. Я передумаю только тогда, когда появится возможность менять компилятор и устанавливать IDE на линукс.
@Eugene А я и не утверждал, что знаю студию. Как указать в VS компилировать релиз я не нашёл. Там было просто "собрать проект" и после сборки он весит несколько МБ. Процесс сборки программ я знаю. Я про это и не говорил. Когда создаётся проект, вместе с кодом создаётся несколько директорий с ненужными проекту файлами. Например, когда я пользовался IDE от JatBrains, там всегда создавалась директория .idea . Я про это говорил. В VSCode создаётся папка .vscode в которой хранятся файлы настроек .json (если менять настройки редактора). VS создаёт файлы, которые не участвуют в процессе компиляции. Когда Вы нажимаете кнопку "открыть проект", появляется окно, в котором Вы выбираете проект, и там есть один файл, который служит только для открытия выбранного проекта в IDE и не для чего больше. Для чего нужны остальные файлы я не знаю. В других IDE таких файлов нет. Про папку с объектными файлами я ничего не говорил.
Да, есть стандарт компилятор языков С/С++, но MSVS не придерживается этого стандарта. Он его нарушает. Так говорят на всех форумах, которые я читаю.
Если рассматривать ситуацию конкретно про массивы, то я не могу указать не константный размер массива. Я должен передать или число или переменную с ключевым словом const, иначе программа не скомпилируется. И если так поступить - нельзя написать такую функцию, чтобы пользователь сам вводил размер массива. Это всё было больше года назад, когда я только начинал изучать программирование. У меня была лабораторка с заданием по массивам. Пользователь должен был сам ввести размер массива, после чего должна была быть выделена память под массив такого объёма, который укажет пользователь. У меня в VS выдавалась ошибка, что размер массива должен быть константым. Я тогда перешёл на DEV-C++ и там этот же код скомпилировался и заработал без ошибок. Как я потом вычитал, это так работает их компилятор. В советах на форуме было: поменять компилятор. Так что не нужно переводить стрелки: MSVS написан не по стандарту компиляторов и нарушает его. Ссылки дать не могу - ютуб удаляет комментарии со ссылками. В любом случае, это было 1 год и 2 месяца назад. С тех пор я не пользовался Visual Studio и осталось о нём негативные воспоминания.
Я изучаю программирование только полтора года, а с VS я работал пару дней. Из-за его компилятора я не мог писать программы и пришлось искать другое IDE. Я не спорю, что Вы знаете больше меня. Но за последний год я много нужных знаний получил. Я описал две объективные проблемы для меня. Для Вас они могут быть и не объективны. Я приводил аргументы связанные только с IDE, а не с компилятором и тому прочим, поэтому не нужно говорить, что я не знаю, как работает компиляция, линковка и тому прочее. Но я мог просто неправильно выразиться на счёт лишних файлов и Вы могли меня не правильно понять.
Я привёл два своих аргумента: кроссплатформенность и компилятор. Думаю, обсуждение сравнения Qt и VS можно закрыть. Мне всё равно больше нечего добавить. Если хотите, можете считать, что я не разбираюсь в VS. Тема не посвящена VS, а Qt. В нём-то я хорошо разбираюсь.
Если один клиент отключится от такого сервера, то он крашнется
А как в таком случае проверить работоспособность сокета?
@@КириллГусарев-р5х можно удалять сокет из пула, при отключении клиента, использовав мапу вместо вектора
@@TheTiznone а как сервер поймёт, что клиент отвалился?
@@КириллГусарев-р5х По сигналу disconnected от сокета
@@TheTiznone можно ведь и из вектора удалить
Привет! Когда ты записуешь данные в массив, я про сервер если что, то можно использовать флаг QIODevice::Truncate. Вместо Data.clear().
Спасибо