Russian Qt Forum
Ноябрь 24, 2024, 01:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по синхронной отправке данных с помощью QTcpSocket ! [РЕШЕНО]  (Прочитано 7069 раз)
AntonUfo
Гость
« : Ноябрь 29, 2011, 15:23 »

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


Как такое сделать ?

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

Заранее огромное спасибо !
« Последнее редактирование: Ноябрь 30, 2011, 13:01 от AntonUfo » Записан
Bepec
Гость
« Ответ #1 : Ноябрь 29, 2011, 15:31 »

Сделать клиенту буфер приема как вариант.
Или же сделать протокол с сигналом готовности приема.

Модель:
Код:
for(;stope;)
{
    С->K - готов работать?
    if (K != "неет, ненадо больше")
    {
        K= "неет, ненадо больше";
        С->К - получай кучу данных.
        K->работать отсюда и до обеда.
        K-> закончил работу
        K="Хочу ЕЩЕЕ!!!";
    }
}
« Последнее редактирование: Ноябрь 29, 2011, 15:35 от Bepec » Записан
AntonUfo
Гость
« Ответ #2 : Ноябрь 29, 2011, 15:50 »

Сделать клиенту буфер приема как вариант.
Или же сделать протокол с сигналом готовности приема.

а можно ли использовать waitForReadyRead / waitForBytesWritten ? если можно, может быть есть примерчик ?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Ноябрь 29, 2011, 15:54 »

Сервер отправляет данные и ждет от клиента ответа о готовности к новым данным.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
AntonUfo
Гость
« Ответ #4 : Ноябрь 29, 2011, 16:29 »

Сервер отправляет данные и ждет от клиента ответа о готовности к новым данным.


ну да вот об этом я и говорю нужно чтобы сервер отправлял данные клиенту и отправлял следующие только после ответа о готовности к приему от клиента....

киньте примерчик : Плачущий

вот слот отправки на сервере

Код:
void MyThread::recievmessages( const QString &strmessage, const QString &arg ){
QByteArray block;
         QDataStream out(&block, QIODevice::WriteOnly);

out.setVersion(QDataStream::Qt_4_4);
         out << (quint64)0; // конец блока

out << arg;        //куда отправляем сообщение
out << strmessage; //строка сообщения

         out.device()->seek(0); //подсчет колличества байтов в сформированном пакете и отсылка информации
quint64 byte = quint64(block.size() - sizeof(quint64)); //подсчитаем реальный размер блока в байтах
         out << byte;
m_client->write(block);
}


вот слот приема на клиенте:

Код:
void ClientRam::updateTcpWidget()
{
QString arg;
QString strmessage;

if (!tcpSocket.isValid()){
return;
}


    quint64 bytesA = tcpSocket.bytesAvailable();
    QDataStream in(&tcpSocket);
    in.setVersion(QDataStream::Qt_4_4);
 
forever {
        if (nextBlockSize == 0) {

            if (bytesA < sizeof(quint64))
                return;
            in >> nextBlockSize;
        }

        if (bytesA < nextBlockSize)
            return;

in >> arg;
in >> strmessage;
 

}
nextBlockSize = 0; //готовы получить новую порцию данных
break;
}
}

но ЭТО работает асинхронно...., а мне нужно синхронно....
« Последнее редактирование: Ноябрь 29, 2011, 16:38 от AntonUfo » Записан
Bepec
Гость
« Ответ #5 : Ноябрь 30, 2011, 06:59 »

эммм... наверно я чего то не понимаю.

Тебе уже сказали, я даже модель действий написал. Делаешь сигнал готовности клиента к приему данных. Который будет или опрашиваться сервером, или клиент сам будет сообщать о готовности приема.
Все тебе уже рассказали, а ты еще чего то просишь?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #6 : Ноябрь 30, 2011, 07:37 »

1) Буфер в QTcpSocket и так есть.
2) Метод recievmessages отправляющий (а вовсе не читающий) данные порвал мне все шаблоны.
3) Ну а так вам уже описали, что для синхронизации пакеты должны идти не в одну сторону (от сервера клиенту), а в обе, то есть клиент должен посылать серверу небольшие пакеты - запросы или подтверждения.

Приблизиельная схема взаимодейтсвия (С=сервер, К=клиент).

С подтверждениями:
*Соединение установлено*
C: Блок данных
*Обработка*
К: Данные обработанны
C: Блок данных
*Обработка*
К: Данные обработанны
C: Блок данных
*Обработка*
К: Данные обработанны
C: Блок данных
*Обработка*
К: Данные обработанны
C: Блок данных
*Обработка*
К: Данные обработанны
*Данные кончились сервер молчит, пока не появятся новые*

С запросами:
*Соединение установлено*
К: Дай мне данные
C: Блок данных
*Обработка*
К: Дай мне данные
C: Блок данных
*Обработка*
К: Дай мне данные
C: Блок данных
*Обработка*
К: Дай мне данные
C: Блок данных
*Обработка*
К: Дай мне данные
C: Нет больше данных
*Таймаут*
К: Дай мне данные
C: Нет больше данных
*Таймаут*
К: Дай мне данные
C: Нет больше данных
*Таймаут*
Записан
AntonUfo
Гость
« Ответ #7 : Ноябрь 30, 2011, 12:20 »

1) Буфер в QTcpSocket и так есть.
2) Метод recievmessages отправляющий (а вовсе не читающий) данные порвал мне все шаблоны.
3) Ну а так вам уже описали, что для синхронизации пакеты должны идти не в одну сторону (от сервера клиенту), а в обе, то есть клиент должен посылать серверу небольшие пакеты - запросы или подтверждения.

спасибо, сделал синхронизацию через флаги и подтверждения....
а чем непонравился recievmessages ?
Записан
Bepec
Гость
« Ответ #8 : Ноябрь 30, 2011, 12:27 »

Переименуй тему в [РЕШЕНО] название темы.

А по поводу метода - привожу перевод.

void MyThread::recievmessages
функция МойПоток::получать Сообщение()
Записан
AntonUfo
Гость
« Ответ #9 : Ноябрь 30, 2011, 13:00 »

Переименуй тему в [РЕШЕНО] название темы.

А по поводу метода - привожу перевод.

void MyThread::recievmessages
функция МойПоток::получать Сообщение()

я с англ. не в ладах... Улыбающийся

но меня все равно не покидает ощущение что я получил велосипед и синхронную передачу можно сделать как то более логично ...
Записан
Bepec
Гость
« Ответ #10 : Ноябрь 30, 2011, 13:20 »

Поверь, сигнал-ответ это синхронная передача, еще начиная с мезозойского периода Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 22.