Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Протокол взаимодействия 
:(
    Опции темы
xbarmaglot
Дата 7.9.2012, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Но тут возникла необходимость переехать на QT-ые объекты QTcpServer и QTcpSocket.
Сразу возникла проблема синхронных вызовов методов сокета.

1. Использование потоковых объектов (QDataStream, QTextStream, ...) внося большую задержку
при отправке данных. Похоже это связано с буферизацией. Ее можно отключить ?
2. Не получается после операции записи синхронно висеть на чтении для получения данных.
Не помогает waitForReadyRead. На нем постоянно висяк. Данные приходят лишь на слот readyRead,
но тогда не получается добиться синхронности.
3. Ну и самая сложная часть. Это все работало пока была схема запрос клиента — ответ сервера.
Но еще понадобилось инициатором запроса быть самому серверу. Но эти операции можно сделать не синхронными.
То есть на запрос сервера ответ может быть, а может и не быть.

Как тогда можно реализовать двухстороннюю схему запросов, при которой клиен выполняет синхронные запросы,
а сервер асинхронные ? 
PM MAIL   Вверх
bsa
Дата 9.9.2012, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



надеюсь, тебе самому понятно, что главная проблема в протоколе?
При отправке запросов клиент добавляет в очередь определенную метку, которая указывает, что за запрос был отправлен. Когда клиент получает ответ, то сверяет с текущей меткой. Если совпадает, значит это ответ на синхронный запрос, если нет, значит асинхронный ответ сервера или сбой передачи данных (определяется уже по данным сервера).
PM   Вверх
xbarmaglot
Дата 10.9.2012, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(bsa @  9.9.2012,  22:37 Найти цитируемый пост)
При отправке запросов клиент добавляет в очередь определенную метку, которая указывает, что за запрос был отправлен. Когда клиент получает ответ, то сверяет с текущей меткой. Если совпадает, значит это ответ на синхронный запрос, если нет, значит асинхронный ответ сервера или сбой передачи данных (определяется уже по данным сервера). 

То есть, например,  при запросе формируется некий объект, который знает ID запроса и имеет объект ожидания.
Он кладется в очередь. При получении ответа проверяется очередь запросов.
Результат сохраняется в найденом объекте и сбрасывается объект ожидания.

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

Я правильно понимаю ?
PM MAIL   Вверх
bsa
Дата 10.9.2012, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



xbarmaglot, ну про объект ожидания я ничего не говорил. Так как все ГУИ по определению асинхронные, поэтому ждать не стоит. Очередь только указывает на какой запрос пришел текущий ответ от сервера.
PM   Вверх
xbarmaglot
Дата 10.9.2012, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(bsa @  10.9.2012,  16:45 Найти цитируемый пост)
 ну про объект ожидания я ничего не говорил.

ну это я предложил вариант решения

Цитата(bsa @  10.9.2012,  16:45 Найти цитируемый пост)
Так как все ГУИ по определению асинхронные, поэтому ждать не стоит. 

у меня нет GUI. А если не ждать, то как принимать решение на запрос?

Цитата(bsa @  10.9.2012,  16:45 Найти цитируемый пост)
Очередь только указывает на какой запрос пришел текущий ответ от сервера.

ну там можно хранить интерфейс, который нужно дернуть при получении ответа.
Или, например, слот нужного объекта.

PM MAIL   Вверх
bsa
Дата 10.9.2012, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(xbarmaglot @  10.9.2012,  19:42 Найти цитируемый пост)
А если не ждать, то как принимать решение на запрос?

выполнять операции при срабатывании слота
PM   Вверх
xbarmaglot
Дата 10.9.2012, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(bsa @  10.9.2012,  20:23 Найти цитируемый пост)
выполнять операции при срабатывании слота 

но ответа может не быть вообще smile
PM MAIL   Вверх
bsa
Дата 10.9.2012, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



для этого существует таймер.
Хотя, я так понял, у тебя сервер всегда отвечает. Если не ответил - проблема связи. В этом случае должен дернуться другой слот.
PM   Вверх
xbarmaglot
Дата 11.9.2012, 06:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(bsa @  10.9.2012,  21:21 Найти цитируемый пост)
для этого существует таймер.

а я расчитывал ожидать завершение операции.

bsa, что-то я не совсем понимаю как ты все это сделал бы асинхронно.
Приведи примерчик своей реализации.
PM MAIL   Вверх
bsa
Дата 11.9.2012, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(xbarmaglot @  11.9.2012,  07:06 Найти цитируемый пост)
bsa, что-то я не совсем понимаю как ты все это сделал бы асинхронно.

отправил запрос и положил в очередь.
отправил еще запрос и положил опять в очередь
...
пришел ответ сервера, взял первый запрос из очереди, проверил, подходит ли он тебе? Подходит, значит это ответ на него, извлек этот запрос из очереди и обработал ответ. Пришел ответ сервер, взял первый запрос из очереди - не подходит, значит это инициатива сервера, - обработал...
PM   Вверх
xbarmaglot
Дата 11.9.2012, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(bsa @  11.9.2012,  10:48 Найти цитируемый пост)
Пришел ответ сервер, взял первый запрос из очереди - не подходит, значит это инициатива сервера, - обработал... 

а если от сервера подряд несколько запросов ?

PM MAIL   Вверх
bsa
Дата 11.9.2012, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



xbarmaglot, и что? Если они не совпадают с первым в очереди запросом от клиента, то проблем не будет. А если будут, то это уже на совести разработчика протокола, так как нехрен делать запросы от сервера совпадающими с ответами на запросы от клиента.
PM   Вверх
xbarmaglot
Дата 11.9.2012, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



bsa, что-то я уже запутался.
Что я хочу получить:
1. Есть оъект, который отвечает за отсылку и прием сообщений. Пусть это поток, который читает очередь сообщений,
которые нужно отправить. И поток, который получает сообщений от сервера. Допустим протокол позволяет
понят что за сообщение пришло от сервера - ответ или запрос.
2. Есть объекты, которые посылают сообщения серверу и ждут результата выполнения.
3. Есть объекты, которые ждут запроса от сервера и отвечают на них.

Как все эти объекты можно связать ?
PM MAIL   Вверх
bsa
Дата 11.9.2012, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



правило №1: никто никого не ждет
потоки на отправку и прием не нужны. Так как это все делается через eventLoop самого Qt.
У тебя есть объект соединения с сервером. У него есть метод отправки сообщений серверу (параметры: сообщение и указатель на объект отправитель). Он добавляет в очередь сообщение с указателем на отправителя и отправляет сообщение серверу... Еще у этого объекта есть список (QMap или QHashMap, точнее) асинхронных запросов сервера с указателями на объекты, их обрабатывающие (в случае, если один тип запросов обрабатывается только одним объектом; если нужно всем отправлять - то достаточно сделать слот). Так вот, приходит от сервера что-то, оно проверяется на соответствие первому в очереди запросу, если соответствует, то запрос удаляется из очереди и вызывается определенный метод объекта-отправителя запроса. Если не совпадает, то обработчик ищется в списке асинхронных запросов.

Все объекты, которые ждут ответа, ждать его не должны. Они отправили запрос и завершили работу. Продолжение работы будет после получения ответа в методе, который будет вызван в этом случае.
PM   Вверх
xbarmaglot
Дата 11.9.2012, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



bsa, а что если не использовать очередь, а подписать всех отправителей на сигнал.
Только тогда отправитель нолжен при срабатываении слота проверить - ему ли ответ или нет.

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

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

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


 




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


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

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