Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Тонкий сервер - Толстый клиент. Вопрос по передачи данных 
:(
    Опции темы
LostAlly
Дата 3.12.2009, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 9.2.2007

Репутация: нет
Всего: нет



Всем здрасти.

Изучаю qt в боевом режиме, нужен совет по направлению копания.

Итак задача.

Клиент - сервер - бд(постгрес)

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

Пришел к такому: написать "тонкий" сервер который будет подключаться к БД аутентифицируясь пользователем БД, затем подключившийся клиент посылает аутентифицируется на сервере, при этом пользователи хранятся в базе проекта. После этого нужно пердавать данные между БД и клиентом. Т.е. сервер в основном нужен для управления правами.

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


Так вот вопрос, с помощью каких классов компонентов я смогу реализовать такую структуру? (соответственно клиент и сервер пока будут на QT) Сервер - линукс, клиенты линукс и виндовс (может еще и макос)

Большое спасибо за внимание.

Это сообщение отредактировал(а) LostAlly - 3.12.2009, 19:14
PM MAIL ICQ   Вверх
null56
Дата 3.12.2009, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Цитата(LostAlly @  3.12.2009,  19:13 Найти цитируемый пост)
Пришел к такому: написать "тонкий" сервер который будет подключаться к БД аутентифицируясь пользователем БД, затем подключившийся клиент посылает аутентифицируется на сервере, при этом пользователи хранятся в базе проекта. После этого нужно пердавать данные между БД и клиентом. Т.е. сервер в основном нужен для управления правами.

Недавно закончил подобный проект, был сервер, который аутентифицировал клиентов и выполнял запросы в соответсвии с правами, которые хранились в базе данных.... единтсвенно у меня всё работало по протоколу SSL.
Собственно, что тебе может понадобиться
Для работы с сетью: QTcpServer, QTcpSocket
Для работы с бд: QSqlDatabase, QSqlQuery
Для работы с потоками (у меня был многопоточный сервер): QThread
Удачи

Добавлено через 2 минуты и 18 секунд
По поводу клиентов, там может понадобиться всё, что твоей душе угодно (я про графику) + QTcpSocket для подключений к серверу

Это сообщение отредактировал(а) null56 - 3.12.2009, 21:13
PM MAIL   Вверх
LostAlly
Дата 4.12.2009, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 9.2.2007

Репутация: нет
Всего: нет



Большое спасибо за ответ.

А каким методом передавали данные от сервера к клиенту?

С сервером более менее все понятно он с базой общается через QSqlDatabase, QSqlQuery, а какими методами клиент запрашивает нужные данные через сервер? (это наиболее непонятный для меня момент, если городить свой протокол взаимодействия, то это уже получится проще нормальный сервер написать)
PM MAIL ICQ   Вверх
chaos
Дата 4.12.2009, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



ИМХО SOAP
PM WWW   Вверх
LostAlly
Дата 4.12.2009, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 9.2.2007

Репутация: нет
Всего: нет



Цитата

ИМХО SOAP

На сколько я понимаю, потом придется переписать кучу всего, чтобы убрать SOAP, а мне хотелось бы на данный момнет минимальных усилий по написанию сервера. А в дальнейшем постепенное перемещение определенных функций с клиента на сервер.

А можно ли:

Клиент герерирует SQL запрос передает его серверу сервер отправляет его БД, сервер возвращает результат в таком виде, как если бы клиент напрямую его получил от бд.

Както так.
PM MAIL ICQ   Вверх
chaos
Дата 4.12.2009, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



Цитата(LostAlly @ 3.12.2009,  16:13)
Изначально предполагалось писать клиента который напрямую обращается в БД. Но так как пользователей будет много, неустраивает заведение всех этих пользователей в пользователи БД.


если выбирать между 3х звенкой и заведением пользователей в системе я п выбрал 2ое, ибо гемороя меньше + даже есть положительные моменты: например модно вести логирование на уровне базы
PM WWW   Вверх
null56
Дата 4.12.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Цитата(LostAlly @  4.12.2009,  07:14 Найти цитируемый пост)
А каким методом передавали данные от сервера к клиенту?

С сервером более менее все понятно он с базой общается через QSqlDatabase, QSqlQuery, а какими методами клиент запрашивает нужные данные через сервер? (это наиболее непонятный для меня момент, если городить свой протокол взаимодействия, то это уже получится проще нормальный сервер написать) 


что значит каким методами.... клиент должен что - то отправить КАКИЕ-ТО ДАННЫЕ
Код

qint64 write ( const char * data, qint64 maxSize )
qint64 write ( const char * data )
qint64 write ( const QByteArray & byteArray )

сервер должен их прочитать и понять
Код

qint64 read ( char * data, qint64 maxSize )
QByteArray read ( qint64 maxSize )
QByteArray readAll ()
qint64 readLine ( char * data, qint64 maxSize )
QByteArray readLine ( qint64 maxSize = 0 )

под какими-то данными я подразумеваю набор команд и дополнительную инфу = иными словами протокол. 
Протокол создать работа творческая и не нудная, тут 1000 и один способ, можешь свой придумать, со своим набором команд или взять уже существующий...
Можешь в качестве варианта взять протокол основанный на xml, тем более классов в Qt достаточно для его реализации и парсинга. Jabber вроде так и работает на протоколе, основанном на xml.
Если не хочешь писать трехзвенку, как тебе написал chaos, то можешь действительно использовать учетные записи самое системы или СУБД
PM MAIL   Вверх
LostAlly
Дата 4.12.2009, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 9.2.2007

Репутация: нет
Всего: нет



Цитата(null56 @  4.12.2009,  17:45 Найти цитируемый пост)
под какими-то данными я подразумеваю набор команд и дополнительную инфу = иными словами протокол. Протокол создать работа творческая и не нудная, тут 1000 и один способ, можешь свой придумать, со своим набором команд или взять уже существующий...Можешь в качестве варианта взять протокол основанный на xml, тем более классов в Qt достаточно для его реализации и парсинга. Jabber вроде так и работает на протоколе, основанном на xml.Если не хочешь писать трехзвенку, как тебе написал chaos, то можешь действительно использовать учетные записи самое системы или СУБД 

Теперь я получил полный ответ smile видимо я несовсем корректно задал вопрос. Мне на начальном этапе как раз и хотелось избежать изобретения своего протокола. Хотелось что то наподобие - экзепляр класса запроса транспортируется на сервер сервер получает данные которые возвращаются на клиент через этот же класс, что то удаленно напоминающее NAT в сетевых технология.

Ну я вас понял, в моем случае проще всего будет использовать xml-rpc.(SOAP более тяжел)

Большое спасибо за ответы, вы помогли мне определиться и выбрать напраление движения.

P.S. с удовольстивем поставил бы плюсы, но пока немогу этого сделать.

Это сообщение отредактировал(а) LostAlly - 4.12.2009, 18:18
PM MAIL ICQ   Вверх
Kipter
Дата 6.12.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 2.5.2006

Репутация: нет
Всего: нет



ИМХО проще свой протокол быстренько накатать чем использовать готовый который заставит ваше приложение под него прогибаться, + который может иметь много своих особенностей работы.
Темболее свой протокол можно реализовать по простому, принимаемые данные десериализовать и где нибудь в начала пакета данных указывать численный метод команды протокола

Код

switch(mypack.command) { case MyProto::NEWUSER: emit NewUser(); break; }


ну в таком духе......

единственное что если клиентов реально мнооооого.... то сервер лучше не на Qt писать, ибо сигналы все таки медленноваты   smile 

Это сообщение отредактировал(а) Kipter - 6.12.2009, 15:25
PM MAIL   Вверх
SABROG
Дата 6.12.2009, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(Kipter @  6.12.2009,  15:24 Найти цитируемый пост)
то сервер лучше не на Qt писать, ибо сигналы все таки медленноваты


Где можно посмотреть сравнение скорости? Есть пример? Какой из методов использовался при написании сервера? Многопоточный, однопоточный? Реально много это сколько? Предел в 10000 клиентов как на DC хабах?

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

Это сообщение отредактировал(а) SABROG - 6.12.2009, 17:05


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0792 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.