DF
Dis FictionMarch 8, 2022, 7:21 a.m.

Общий вопрос по клиент-серверному приложению с MYSQL

c++, сети

Всем доброго дня, в учебных целях пишу на С++ клиент-серверное приложение, с использованием MYSQL.
На данном этапе есть решение с 2 проектами клиента и сервера, работает обмен сообщениями между ними.
Вопрос - правильно ли я понимаю что делать дальше, нужно в проекте сервера создать взаимодействие с локальной БД, а со стороны клиента "сообщениями" отправлять SQL-запросы на сервер? Или всё делается как-то иначе?

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

7
Виктор Калесников
  • March 8, 2022, 9:01 a.m.
  • (edited)

Отправлять от клиента сообщения с SQL запросами? Как то странно или я не понял.
А так то нужен протокол для обмена данными между сервером и клиентом.

1) К примеру модифицированный SRT
struct Packet {
bool mode; // тип пакета: управляющий = 1 . данные = 0
uint16_t controlType; // команда
uint16_t subType;
uint32_t typeInfo;
uint32_t timeStamp;
uint32_t destSocket;
QByteArray data; // сообщение
};
В QByteArray data пакуй любой тип данных (QDataStream) и на сервере распаковывай. А на основе полученных данных делай SQL запрос.

2) А можно в json паковать. Еще правильней хоть и менее производительней.

p.s Пример бинарного протокола выше это актуально для высокопроизводительных UDP серверов.
Хотя для highload QByteArray через QDataStream медленно работает. Там нужно извращаться с memcpy и тд.

    Я делаю без Qt в этот раз, на чистых плюсах с использованием сокетов. На данном этапе я пока что могу запустить проекты клиента и сервера, в консоли писать сообщение к примеру от клиента, и оно отобразится на сервере, т.е. обычный чат в консоли. Сообщения в формате char[].
    Я хотел бы понять, как устроено клиент-серверное приложение с базой данных, это мой первый такой проект, так что заранее извиняюсь за возможно глупые вопросы. Просто не хочу сделать непойми что.
    Как я это себе представляю - от клиента приходит сообщение с запросом серверу, в проекте сервера происходит подключение к локальной базе данных:

    if (!mysql_real_connect(conn, "localhost", "root", "mypassw11", "mytest_DB2", NULL, NULL, 0)) 
    

    далее некий запрос:

    if (mysql_query(conn, "SELECT * FROM university") > 0)
    

    И далее результат запроса возвращается клиенту.
    В правильном ли направлении я вообще двигаюсь? И вообще правильно ли связывать клиент-серверное приложение и базу данных таким образом, или всё должно выглядеть вообще иначе, а вот так никто не делает?

      Виктор Калесников
      • March 8, 2022, 1:11 p.m.
      • (edited)

      Упаковывай запрос клиента в json и распаковывай на сервере.
      Для упаковки найди библиотеку сериализации в json.

      Хотя конечно можно string/char (sql команда) с запросом от клиента отправлять на сервер.
      Это самое простое и само собой напрашивающееся. Хотя это как то бестолково на мой взгляд.

      Тебе в любом случае нужен протокол обмена данных между сервером и клиентом.
      И соответственные обработчики на обоих сторонах. Ищи варианты как использовать json.

        Смог подключить json к visual studio, но send() принимает только поток байтов, по умолчанию для передачи запроса через send() использовалось const char*, для передачи объекта действительно нужно использовать сериализацию.
        Правильно ли я понимаю, что суть всех этих манипуляций в том, что-бы передавать серверу четко структурированный запрос из ключей и значений, дальше сервер из значений сам составляет запрос к БД, и поэтому Вы сказали, что передавать запрос просто строкой бестолково?

          Дв, именно так.
          Если бы все обошлось только запросами в базе то в теории можно было бы и запрос sql строку посылать.
          Но так не делают по причине того что наверняка появится нужда каких либо действий на стороне сервера\клиента не связанных с базой. И тогда строка уже не SQL запрос содержит а команду на исполнение. А как сервер определит что эту строку нужно не как запрос в базу посылать а отдельно обработать?

            Спасибо за помощь, вроде всё +- получилось. Пока выглядит так - с помощью сериализации перевожу json в строку и передаю серверу, там обратно собираю в json, пока в учебных целях у json-объекта 2 поля - тип команды (команда серверу/запрос к БД), и сама команда. Далее получаю из БД результирующую таблицу, и возвращаю клиенту построчно. Это похоже на правду?

              Виктор Калесников
              • March 11, 2022, 4:19 a.m.

              Да, в целом правильно.

                Comments

                Only authorized users can post comments.
                Please, Log in or Sign up
                AD

                C ++ - Test 004. Pointers, Arrays and Loops

                • Result:50points,
                • Rating points-4
                m

                C ++ - Test 004. Pointers, Arrays and Loops

                • Result:80points,
                • Rating points4
                m

                C ++ - Test 004. Pointers, Arrays and Loops

                • Result:20points,
                • Rating points-10
                Last comments
                Evgenii Legotckoi
                Evgenii LegotckoiOct. 31, 2024, 2:37 p.m.
                Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                A
                ALO1ZEOct. 19, 2024, 8:19 a.m.
                Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                ИМ
                Игорь МаксимовOct. 5, 2024, 7:51 a.m.
                Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                d
                dblas5July 5, 2024, 11:02 a.m.
                QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                k
                kmssrFeb. 8, 2024, 6:43 p.m.
                Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                Now discuss on the forum
                Evgenii Legotckoi
                Evgenii LegotckoiJune 24, 2024, 3:11 p.m.
                добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                t
                tonypeachey1Nov. 15, 2024, 6:04 a.m.
                google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                NSProject
                NSProjectJune 4, 2022, 3:49 a.m.
                Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                9
                9AnonimOct. 25, 2024, 9:10 a.m.
                Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                Follow us in social networks