Russian Qt Forum

Qt => Работа с сетью => Тема начата: kibsoft от Апрель 13, 2010, 20:28



Название: Передача данных в отдельном потоке. Сервер не успевает обработать данные.
Отправлено: kibsoft от Апрель 13, 2010, 20:28
Есть сервер и клиент (отсылает данные, например файл):
Клиент:
Код:
void FileSender::sendFile()
{
    QFile file(filePath);
    if (file.open(QIODevice::ReadOnly)) {//если файл открылся
        QByteArray dataForPeer;//массив для данных
        QDataStream out(&dataForPeer, QIODevice::WriteOnly);//выходной поток
        QByteArray byteArray;//поток байтов из файла
        while(!file.atEnd()) {//пока не конец файла
             byteArray=file.read(1024);//читаем по килобайту
             out << quint16(0) << FILEBYTES << byteArray;
             out.device()->seek(0);
             out << quint16(dataForPeer.size() - sizeof(quint16));
             tcpSocket->write(dataForPeer);

             dataForPeer.clear();//очищаем массив для отправки серверу
        }
        //отправка уведомления об окончании передачи файла
        out << quint16(0) << SENDING_FINISHED;
        out.device()->seek(0);
        out << quint16(dataForPeer.size() - sizeof(quint16));
        tcpSocket->write(dataForPeer);

        file.close();//закрываем файл
    }
}

На сервере есть слот, соединенный с сигналом readyRead сокета, но видимо данные приходят так быстро, что сервер не успевает сделать нужные действия (а именно записать на диск). Что можно придумать? Можно ли как то на клиенте узнать считаны ли данные сервером или нет(и ждать этого момента)? В голову приходит только одно: от сервера высылать уведомление о принятых данных, чтобы клиент мог дальше передавать их (но мне кажется, что что-то не то).


Название: Re: Передача данных в отдельном потоке. Сервер не успевает обработать данные.
Отправлено: BOBO4KA от Апрель 13, 2010, 22:30
Попробуй так )
Код:
tcpSocket->write(dataForPeer);
tcpSocket->flush();


Название: Re: Передача данных в отдельном потоке. Сервер не успевает обработать данные.
Отправлено: merke от Сентябрь 22, 2010, 15:33
kibsoft, можете ли Вы пожалуйста, написать здесь реализацию принимающей стороны.

Или Дорогие форумчане, может Вы поможете реализовать эту часть!

Буду очень рад помощи!


Название: Re: Передача данных в отдельном потоке. Сервер не успевает обработать данные.
Отправлено: kibsoft от Сентябрь 22, 2010, 17:49
Вот исходники того, что я тогда реализовал. fileserver - это реализация сервера, в котором запускается fileserverthread. filesender - это отправщик файлов.


Название: Re: Передача данных в отдельном потоке. Сервер не успевает обработать данные.
Отправлено: merke от Сентябрь 22, 2010, 18:23
Спасибо, огромное! буду разбираться!


Название: Re: Передача данных в отдельном потоке. Сервер не успевает обработать данные.
Отправлено: Scotty от Ноябрь 11, 2010, 17:57
Можно поинтересоваться, а этот исходник компилируется под чем? Я попытался прикрутить этот исходник к себе в проект - масса ошибок компиляции  :( Даже не знаю что и делать. В частности ругается на такой код:
Код:
  FileSendFinisher::FileSendFinisher(QObject *parent=0): QObject(parent), nextBlockSize(0);
Я так и не нашел метод nextBlockSize


Название: Re: Передача данных в отдельном потоке. Сервер не успевает обработать данные.
Отправлено: BRE от Ноябрь 11, 2010, 19:35
Я так и не нашел метод nextBlockSize
А в переменных класса ты смотрел?  ;)


Название: Re: Передача данных в отдельном потоке. Сервер не успевает обработать данные.
Отправлено: Edynchik от Январь 04, 2011, 16:22
Вот исходники того, что я тогда реализовал. fileserver - это реализация сервера, в котором запускается fileserverthread. filesender - это отправщик файлов.
Не могу разобраться, в fileserver не срабатывает сигнал newconnection, и как следствие не запускается fileserverthread. filesender к другому серверу(собственно написанному подключается нормально)...помогите разобраться в чем проблема...


Название: Re: Передача данных в отдельном потоке. Сервер не успевает обработать данные.
Отправлено: merke от Январь 04, 2011, 16:39
http://www.prog.org.ru/index.php?topic=16260.msg108026;topicseen#new

Попробуйте данный пример


Название: Re: Передача данных в отдельном потоке. Сервер не успевает обработать данные.
Отправлено: Edynchik от Январь 13, 2011, 17:49
Попробуйте данный пример
Спасибо,появилось уже хоть что то, буду теперь остальное прикручивать...