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

Поделиться
HTML-код
  • Опубликовано: 8 ноя 2024

Комментарии • 127

  • @Mr.Ahavzi
    @Mr.Ahavzi Год назад +21

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

    • @grevlir8732
      @grevlir8732 4 месяца назад +1

      Премного благодарен, НИГДЕ не мог найти именно вот эту функцию о которой ты написал, хотя перерыл достаточно много "ентернета ентого"!
      Вот как у меня выглядит слот (всё под копирку с твоих слов, просто в виде кода):
      void Server::slotClientDisconnected()
      {
      socket = (QTcpSocket*)sender();
      Sockets.erase(std::remove(Sockets.begin(), Sockets.end(), socket), Sockets.end());
      socket->deleteLater();
      }

  • @openFrimeTv
    @openFrimeTv 2 года назад +22

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

    • @programmcat
      @programmcat  2 года назад +4

      Спасибо

    • @unrealengineruseng9583
      @unrealengineruseng9583 2 года назад

      Согласен, отличные уроки просто, я аж вспотел ))))

    • @АлиСаад-щ5ч
      @АлиСаад-щ5ч 2 года назад

      @@programmcat друг не поможешь добавить передачу файлов в чат или картинок, очень надо просто

    • @programmcat
      @programmcat  2 года назад

      @@АлиСаад-щ5ч принцип такой-же

    • @АлиСаад-щ5ч
      @АлиСаад-щ5ч 2 года назад

      @@programmcat а можно поподробнее узнать. Нужно вставлять картинку в сам textBrowser при нажатии на кнопку или как ?

  • @daniilk4994
    @daniilk4994 7 месяцев назад +1

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

  • @-USER_NAME
    @-USER_NAME 2 года назад +4

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

  • @ravilizmailov3994
    @ravilizmailov3994 2 года назад +10

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

    • @programmcat
      @programmcat  2 года назад

      Спасибо за поддержку, надеюсь когда-нибудь выйти на монетизацию 😃 Qt что-то не особо заходит

  • @DadundddaD
    @DadundddaD 11 месяцев назад +2

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

  • @gribnoiz
    @gribnoiz 2 года назад +9

    Спасибо за твой труд!

  • @ЕгорКрасный-ь4г
    @ЕгорКрасный-ь4г 2 года назад +5

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

  • @artyomgolenischev3708
    @artyomgolenischev3708 2 года назад +10

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

    • @programmcat
      @programmcat  2 года назад +1

      Хорошо👍

    • @dimongnezdilov3267
      @dimongnezdilov3267 2 года назад +1

      Да, кстати ! Присоединился бы к обсуждению темы работы в QT с документами. Если, к примеру, чтение и запись в txt файл проблем не вызывает, то вот как быть с документами Word'a ? Знаю, что записать в Word-овский файл можно с помощью HTML, но вот как быть с чтением этого файла для меня до сих пор остаётся загадкой...

    • @КириллГусарев-р5х
      @КириллГусарев-р5х 2 года назад

      @@dimongnezdilov3267 погугли библиотеку для плюсов для работы с вордом.

    • @dimongnezdilov3267
      @dimongnezdilov3267 2 года назад

      @@КириллГусарев-р5х спасибо за совет ))

  • @nikert1326
    @nikert1326 Год назад +1

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

  • @ФёдорУрусов-д8ж
    @ФёдорУрусов-д8ж 2 года назад +4

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

  • @mariarudeyko2986
    @mariarudeyko2986 2 года назад +2

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

  • @МихаилБорисов-д6я
    @МихаилБорисов-д6я 2 года назад +6

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

    • @programmcat
      @programmcat  2 года назад

      Лайк, подписка))

  • @МарияОрехова-ш4ш
    @МарияОрехова-ш4ш Год назад +2

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

  • @Programscape
    @Programscape Год назад +1

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

  • @Корыч
    @Корыч 2 года назад +3

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

  • @GuNStaRia
    @GuNStaRia Год назад +4

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

  • @gergkull8065
    @gergkull8065 2 года назад +2

    Огонь!!!!

  • @АндрейМиськив-к8ж
    @АндрейМиськив-к8ж 2 года назад +2

    Просто спасибо!

  • @universemessenger2674
    @universemessenger2674 2 года назад +1

    Спасибо тебе большое! Очень помог! 😊

  • @DadundddaD
    @DadundddaD 11 месяцев назад

    Видео шикарное

  • @VladykaVladykov
    @VladykaVladykov Год назад +1

    Активное ожидание напрягает, конечно

  • @traydr-1609
    @traydr-1609 Год назад +1

    Ты лучший)

  • @DadundddaD
    @DadundddaD 11 месяцев назад

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

  • @kodisworld7016
    @kodisworld7016 2 года назад +1

    Красавчик !

  • @alexandrivanov9985
    @alexandrivanov9985 2 года назад +2

    Круто, очень помогло!

  • @ВладСперанский-ъ5в

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

  • @АндрейБудин-ь8м
    @АндрейБудин-ь8м 2 года назад +3

    Всё хорошо, только очень мелкий шрифт в IDE. Спасибо за урок!

  • @nokia_n-gage
    @nokia_n-gage 2 года назад

    Спасибо!

  • @usernamer519
    @usernamer519 Год назад

    Отличный ролик, но очень медленно говорите, шутка, на 0.25 не могу уследить, за кодом :(
    В любом случае, спасибо, очень помогло.

  • @yunushkin88
    @yunushkin88 2 года назад +1

    О у меня 2 года назад почти такое же было задание на собеседовании)

    • @КириллГусарев-р5х
      @КириллГусарев-р5х 2 года назад

      Мне сегодня дали похожее тестовое задание - надо отправлять файлы по TCP/UDP с одной проги в другую

  • @BlinCT
    @BlinCT 2 года назад +1

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

  • @василийгаджет
    @василийгаджет Год назад +3

    исходники бы оставил >

  • @Km-pn3hf
    @Km-pn3hf 2 года назад

    спасибо

  • @ДашиЦыбикжапов-й8р

    Нереально крутой видос!!
    есть один момент, сделал все как в видео про сборку с экзешника, заливаю на гит, скачиваю, а там такая ошибка: не удается продолжить выполнение кода поскольку система не обнаружила qt5widgets, и еще пара библиотек dll,

  • @Mdwed
    @Mdwed Год назад

    Спасибо за ролик
    А сервер может каким-то образом понять что подключение было потеряно?

  • @ammonjerro396
    @ammonjerro396 2 года назад

    Всё очень круто, но есть один вопрос. Вы это всё сами из головы делали или по какой-то инструкции и в процессе были ошибки, которые вы исправляли по ходу написания?

    • @daniltoropov5623
      @daniltoropov5623 Год назад +2

      Есть книга, где так же подробно описан подобный проект (хотя возможно автор именно от туда его и позаимствовал), называется "Qt 5.10. Профессиональное программирование на C++". Подобный проект находится на странице 555 Глава 39

    • @МарияОрехова-ш4ш
      @МарияОрехова-ш4ш Год назад

      Мне без разницы откуда. Главное, что информация дана, всё наглядно и по делу, а если этот пример еще и на какой-то книге основывается - вообще супер. Даниле спасибо за название книги, постараюсь найти, почитать.

    • @ammonjerro396
      @ammonjerro396 Год назад

      @@МарияОрехова-ш4ш твоё мнение мне очень важно. Держи в курсе.

  • @BITniki
    @BITniki 2 года назад +2

    Ещё вопросик)
    Я решил реализовать удалённое управление мышью и у меня возникла проблема задержки обработки получаемых сообщений.
    Суть в том, что если я сделаю резкое движение пальцем, то сервер начинает опаздывать с обработкой сообщения. Причём так, что если я пошлю новое сообщение, то он начнёт обрабатывать старое, а если не посылаю, то стек сообщений так и лежит, ожидая своей очереди. Код slodReadyRead() у меня аналогичный. Есть идеи, как подобное исправить?

  • @toniess4620
    @toniess4620 2 года назад +1

    А возможно организовать модель клиент-сервер в рамках нелокальной сети (на разных устройствах, не подключенных к одной сети)? Заранее спасибо)

    • @КириллГусарев-р5х
      @КириллГусарев-р5х Год назад

      Ну таким же образом. Надо только IP в обеих программах указать другой.

  • @DadundddaD
    @DadundddaD 11 месяцев назад

    А почему размер блока всегда в 2 раза больше того, что мы отправляем?

  • @НастоящийКорабль
    @НастоящийКорабль 9 месяцев назад

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

  • @BlinCT
    @BlinCT 2 года назад

    И еще малый вопрос, сервер же должен в бесконечном цыкле крутиться и постоянно быть запущенным. А у вас я что-то не увидел этого. Или я что то не допонял.

    • @КириллГусарев-р5х
      @КириллГусарев-р5х 2 года назад +1

      Когда клиент попытается установить соединение с сервером, на сервере возникает соответствующее событие/сигнал и вызывается функция incomingConnection. А при получении сообщения от клиента вызовется readyRead. Циклы здесь не нужны

  • @kniazblitz5873
    @kniazblitz5873 Год назад

    Может быть я что-то не понимаю, но где и в какой момент вызывается incommingConnection?

    • @АндрейСуханов-д1ч
      @АндрейСуханов-д1ч Год назад +1

      Под капотом запускается. Эта функция виртуальная в QTcpServer. Засчёт полиморфизма будет использоваться реализация наиболее далекого потомка - в наш случае как раз класса Server.

  • @АлиСаад-щ5ч
    @АлиСаад-щ5ч 2 года назад

    а могли бы показать как наладить передачу картинок?

  • @Kangoshi_ru
    @Kangoshi_ru 2 года назад

    Если один или несколько клиентов "отвалятся" от сервера во время передачи сообщения, то что произойдёт? Насколько я понимаю подтверждение приёма сообщения не происходит? Т.е. после восстановления соединения этот клиент уже не получит пропущенное сообщение? Сможет ли он вообще подключится, если сервер ещё не закроет его сокет? Каким образом сервер решает, что нужно закрыть сокет по тайм-ауту? И сколько времени составляет этот тайм-аут?

    • @Kangoshi_ru
      @Kangoshi_ru 2 года назад

      Не говоря уже о проверке принимаемых сообщений, чтобы избежать возможных эксплойтов.

    • @programmcat
      @programmcat  2 года назад

      Слишком много вопросов задаёшь

  • @BITniki
    @BITniki 2 года назад

    Видео топ!
    Слушай, а что за qintptr и зачем он тут? 5 секунд гугления мне не помогло

    • @programmcat
      @programmcat  2 года назад

      Это тип данных, целое положительное

    • @КириллГусарев-р5х
      @КириллГусарев-р5х 2 года назад +1

      А зачем гуглить, если можно навести мышь на этот тип и появится подсказка? о_О😶🤲
      Или нажать ПКМ -> Перейти к реализации.

  • @nikiforovpteacher
    @nikiforovpteacher 11 месяцев назад

    Написал код сервера в QT 6.2. Сразу выдает error и падает с ошибкой. 10я Windows. Код проверил 3 раза, совпадает вплоть до последнего значка.

  • @ДаниилБуцкий-ш5ъ
    @ДаниилБуцкий-ш5ъ 6 месяцев назад

    Может подскажет кто-нибудь как пофиксить. Сделал все один в один а incomingConnection почему-то не запускается, с чем это может дать связано? Может надо где-то слот поставить, или собрать как-то по-особенному. Папки с сборкой я удали и пересобрал перед запуском.

    • @ДаниилБуцкий-ш5ъ
      @ДаниилБуцкий-ш5ъ 6 месяцев назад

      Получается что просто не может клиент подключиться к серверу

    • @grundezz7331
      @grundezz7331 5 месяцев назад

      @@ДаниилБуцкий-ш5ъ Такая же проблема, решил?

  • @Eric_Tijuana
    @Eric_Tijuana 2 года назад +1

    Всё бы хорошо но очень маленький шрифт, очень тяжело разглядеть

    • @programmcat
      @programmcat  2 года назад

      Попробуй посмотреть с компьютера, говорят помогает

    • @Eric_Tijuana
      @Eric_Tijuana 2 года назад

      @@programmcat да я с компа и смотрю мб монитор маленький

  • @ДаниилБуцкий-ш5ъ
    @ДаниилБуцкий-ш5ъ 6 месяцев назад

    Есть у кого-нибудь код полностью всей этой штуки?

  • @artyomgolenischev3708
    @artyomgolenischev3708 2 года назад +1

    Есть вопрос. Как думаете, можно ли по TCP наладить обмен данными таким же образом между ПК и микроконтроллером STM32 ? Микроконтроллер подключен через сетевую карту Ethernet.

  • @dmitriyalimov3475
    @dmitriyalimov3475 Год назад

    Сервер выводит только "start" и всё, хотя всё написано аналогично. Подскажите как пофиксить?

    • @ВладРеут-с4ъ
      @ВладРеут-с4ъ Год назад

      Слот incomingConnection и его аргумент нужно писать как в видео, это override.

  • @brainpet4474
    @brainpet4474 8 месяцев назад

    з вектора Sockets треба видаляти укаватель на сокет коли він закривається

  • @ShandlRu
    @ShandlRu Год назад

    А что делать, если клиенту не известен IP адрес сервера? Просто известно, что он в той же подсети? Как реализовать широковещательный запрос от клиента в сеть, чтобы сервер ему ответил и дал свой адрес, чтобы потом клиент с этим адресом сервера работал?

    • @programmcat
      @programmcat  Год назад

      Никак

    • @ShandlRu
      @ShandlRu Год назад

      @@programmcat неужели у Qt нет такой возможности? Это даже у SFML Network есть... Там клиент посылает по всей сети в режиме broadcast на нужный порт запрос и сервер может его обработать, получить адрес клиента и ему отправить свой адрес...

  • @idodoqdo5783
    @idodoqdo5783 2 года назад

    Сделал все тоже самое, аналогичный код, но клиент не подключается к серверу. Сервер как вывел 1 раз "start" так больше ничего не видит. Помогите пожалуйста; может кто сталкивался с такой проблемой? Клин и ребилд не помогли

    • @idodoqdo5783
      @idodoqdo5783 2 года назад

      Почему-то приложение каждый раз выбирает новый порт, а не указаный 2323

    • @idodoqdo5783
      @idodoqdo5783 2 года назад

      Я просто по невнимательности ставил порт в ифе через запятую после listen(). Всё работает

    • @dmitriyalimov3475
      @dmitriyalimov3475 Год назад

      @@idodoqdo5783 У меня такая же ошибка, только всё правильно написано, как пофиксить?

    • @grundezz7331
      @grundezz7331 5 месяцев назад

      @@dmitriyalimov3475 Такая же проблема, нашел решение?

  • @NoName-ep8jk
    @NoName-ep8jk Год назад

    ти не показав де ти викликав слот incomingConnection()...

  • @arda8226
    @arda8226 3 месяца назад

    музыка сильно мешает :(

  • @dashitsybikzhapov9850
    @dashitsybikzhapov9850 Год назад

    Могу ли я кому нибудь раздать клиент, и чатиться на разных машинах

    • @programmcat
      @programmcat  Год назад

      да

    • @programmcat
      @programmcat  Год назад

      в локальной сети только, с интернетом по другому работает

    • @dashitsybikzhapov9850
      @dashitsybikzhapov9850 Год назад

      @@programmcat раздается папка с релизом правильно понимаю?)

    • @programmcat
      @programmcat  Год назад

      @@dashitsybikzhapov9850 ruclips.net/video/F9ihThZPUvc/видео.html

    • @ИльяКудлач-ч1ц
      @ИльяКудлач-ч1ц Год назад

      @@programmcat А как сделать так, чтобы общение было через интернет?

  • @nakamasama
    @nakamasama 2 года назад +4

    Как фиксить проблему? Никак! У самого есть такая проблема. Например, сейчас я работаю над библиотекой для обработки данных. Библиотеки 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 и твоего канала.

    • @programmcat
      @programmcat  2 года назад +2

      Спасибо! До метода додумался сам где-то полгода назад, когда несколько дней не мог понять, почему не работает рабочий код. Всегда считал что должен быть другой выход, на форумах ничего найти не мог подобного ))

    • @nakamasama
      @nakamasama 2 года назад +1

      @Eugene Я даже расширения ставил. У меня он всё равно все подключаемые библиотеки подчёркивает и кажет, что у меня их нет. Так ошибкой он считает любой метод, который я пытаюсь использовать. Это во-первых. А во-вторых, всё равно ведь нужно открыть Qt и там собирать приложения. В VSCode нет даже расширения для qmake и метаобъектного компилятора Qt, а CMake не решает проблему с тем же метаобъектным компилятором. Так зачем писать код в VSCode потом переключаться на Qt и собирать программу? Легче, когда всё в одном. Теперь, когда я настроил вид и тему Qt, мне будет приятнее им пользоваться. Вот если использовать Qt при написании программ на Питоне, тут всё элементарно. Скачал PyQt через pip и спокойно пишешь себе код. Никаких проблем.
      У Вас может и работает, не спорю. Но у меня нет.

    • @nakamasama
      @nakamasama 2 года назад

      @Eugene Да. Я ещё раз перечитал. Я неправильно понял. Объясняю. Я Visual Studio не рассматриваю, так как у него нет версии для Линукса. Я разрабатываю программы одновременно для двух систем и на двух системах. Да и лично у меня он (VS) в базовой комплектации занимал больше места, чем Qt, и после запуска требует больше оперативки. У Вас может быть по другому. Почему я сравниваю простой редактор и полноценную IDE? Потому что для написания простых библиотек или консольных приложений на С++ мне достаточно простого редактора кода. И для сборки проектов я пишу собственные makefiles. Мне так удобнее. Для этого мне не нужны мощности Qt. Qt я использую только для написания графических приложения. Также я немного пишу на Питоне. Для него мне с головой хватает возможностей редактора кода. Да, я пляшу с компиляторами и прочая, как Вы пишете. Пускай это не проще, но мне так удобнее.
      Однако если бы Visual Studio был бы на Линуксе, я бы с радостью им бы пользовался. Так как я пользуюсь обеими системами (такие обстоятельства, по другому пока не могу), мне приходится пользоваться кроссплатформенными решениями. Поэтому я использую и Qt, и VS Code. Всё зависит от поставленных задач и проекта.
      В любом случае, вопросы "чем пользоваться?" и "как пользоваться?" - это вкусовщина. Каждый останется при своём мнении.

    • @nakamasama
      @nakamasama 2 года назад

      @Eugene Я, кстати вспомнил главную причину, почему я им не хочу пользоваться. Когда VS создаёт проект, там создаётся куча лишних файлов, которые нужны только IDE. В то время, когда нужно написать простую программу, можно создать один или пару файлов проекта и самому его скомпилировать. Указав нужный ключ (-s), конечный экзешник будет весить сотню килобайт, без него программа весит 3 МБ. При написании программ на VS, её нужно сначала как-то настроить, чтобы она компилировала лёгкие экзешники, иначе все будут весить по 3 МБ. Да и в целом он медленнее компилирует.
      Есть одна вещь в VS, от которой у меня сильно подгарает. Это его отношение к массивам. Точнее, его компилятора. Я просто не могу писать программы с использованием массивов на VS. У него используется свой компилятор MSVS, который я всем своим духом не переношу. Как только я где-то вижу или слышу этот компилятор - меня начинает тошнить. А поменять на свой - НЕЛЬЗЯ! Я пользуюсь компилятором TDM-GCC. Как по мне он самый лучший.
      Я пользовался большим количеством IDE. Я искал хорошее решение. И все при создании проекта создают кучу лишних не нужных файлов проекту. Они нужны только IDE. Но есть одно исключение - Qt. Только одна эта IDE не создаёт ничего лишнего: только файлы с кодом и .pro-файл (аналог makefile).
      Вывод: из-за отсутствия кроссплатформенности, создания кучи лишних файлов (не пойми для чего нужных), невозможности изменить компилятор и просто тяжеловесности я не пользуюсь этой IDE и не буду пользоваться. Я передумаю только тогда, когда появится возможность менять компилятор и устанавливать IDE на линукс.

    • @nakamasama
      @nakamasama 2 года назад

      @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. В нём-то я хорошо разбираюсь.

  • @TheTiznone
    @TheTiznone 2 года назад

    Если один клиент отключится от такого сервера, то он крашнется

    • @КириллГусарев-р5х
      @КириллГусарев-р5х 2 года назад

      А как в таком случае проверить работоспособность сокета?

    • @TheTiznone
      @TheTiznone 2 года назад

      @@КириллГусарев-р5х можно удалять сокет из пула, при отключении клиента, использовав мапу вместо вектора

    • @КириллГусарев-р5х
      @КириллГусарев-р5х 2 года назад

      @@TheTiznone а как сервер поймёт, что клиент отвалился?

    • @TheTiznone
      @TheTiznone 2 года назад

      @@КириллГусарев-р5х По сигналу disconnected от сокета

    • @mariarudeyko2986
      @mariarudeyko2986 2 года назад

      @@TheTiznone можно ведь и из вектора удалить

  • @Illuxel
    @Illuxel 2 года назад +1

    Привет! Когда ты записуешь данные в массив, я про сервер если что, то можно использовать флаг QIODevice::Truncate. Вместо Data.clear().

  • @maksimlepel9594
    @maksimlepel9594 Год назад

    Спасибо