Russian Qt Forum

Qt => Работа с сетью => Тема начата: AntonUfo от Ноябрь 29, 2011, 15:23



Название: Вопрос по синхронной отправке данных с помощью QTcpSocket ! [РЕШЕНО]
Отправлено: AntonUfo от Ноябрь 29, 2011, 15:23
Всем привет, имеется сервер и клиент, сервер шлет большие объемы данных клиенту, приняв пакет данных клиент должен его обработать (это, занимает время) и только потом сервер должен прислать клиенту новую порцию даных, т.е. между отправкой данных сервером должно проходить такое время что бы клиент отработав был готов принять новую порцию.


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

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

Заранее огромное спасибо !


Название: Re: Вопрос по синхронной отправке данных с помощью QTcpSocket !
Отправлено: Bepec от Ноябрь 29, 2011, 15:31
Сделать клиенту буфер приема как вариант.
Или же сделать протокол с сигналом готовности приема.

Модель:
Код:
for(;stope;)
{
    С->K - готов работать?
    if (K != "неет, ненадо больше")
    {
        K= "неет, ненадо больше";
        С->К - получай кучу данных.
        K->работать отсюда и до обеда.
        K-> закончил работу
        K="Хочу ЕЩЕЕ!!!";
    }
}


Название: Re: Вопрос по синхронной отправке данных с помощью QTcpSocket !
Отправлено: AntonUfo от Ноябрь 29, 2011, 15:50
Сделать клиенту буфер приема как вариант.
Или же сделать протокол с сигналом готовности приема.

а можно ли использовать waitForReadyRead / waitForBytesWritten ? если можно, может быть есть примерчик ?


Название: Re: Вопрос по синхронной отправке данных с помощью QTcpSocket !
Отправлено: Пантер от Ноябрь 29, 2011, 15:54
Сервер отправляет данные и ждет от клиента ответа о готовности к новым данным.


Название: Re: Вопрос по синхронной отправке данных с помощью QTcpSocket !
Отправлено: AntonUfo от Ноябрь 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;
}
}

но ЭТО работает асинхронно...., а мне нужно синхронно....


Название: Re: Вопрос по синхронной отправке данных с помощью QTcpSocket !
Отправлено: Bepec от Ноябрь 30, 2011, 06:59
эммм... наверно я чего то не понимаю.

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


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

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

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

С запросами:
*Соединение установлено*
К: Дай мне данные
C: Блок данных
*Обработка*
К: Дай мне данные
C: Блок данных
*Обработка*
К: Дай мне данные
C: Блок данных
*Обработка*
К: Дай мне данные
C: Блок данных
*Обработка*
К: Дай мне данные
C: Нет больше данных
*Таймаут*
К: Дай мне данные
C: Нет больше данных
*Таймаут*
К: Дай мне данные
C: Нет больше данных
*Таймаут*


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

спасибо, сделал синхронизацию через флаги и подтверждения....
а чем непонравился recievmessages ?


Название: Re: Вопрос по синхронной отправке данных с помощью QTcpSocket !
Отправлено: Bepec от Ноябрь 30, 2011, 12:27
Переименуй тему в [РЕШЕНО] название темы.

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

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


Название: Re: Вопрос по синхронной отправке данных с помощью QTcpSocket !
Отправлено: AntonUfo от Ноябрь 30, 2011, 13:00
Переименуй тему в [РЕШЕНО] название темы.

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

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

я с англ. не в ладах... :)

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


Название: Re: Вопрос по синхронной отправке данных с помощью QTcpSocket ! [РЕШЕНО]
Отправлено: Bepec от Ноябрь 30, 2011, 13:20
Поверь, сигнал-ответ это синхронная передача, еще начиная с мезозойского периода :)