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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача данных в отдельном потоке. Сервер не успевает обработать данные.  (Прочитано 8673 раз)
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« : Апрель 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 сокета, но видимо данные приходят так быстро, что сервер не успевает сделать нужные действия (а именно записать на диск). Что можно придумать? Можно ли как то на клиенте узнать считаны ли данные сервером или нет(и ждать этого момента)? В голову приходит только одно: от сервера высылать уведомление о принятых данных, чтобы клиент мог дальше передавать их (но мне кажется, что что-то не то).
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
BOBO4KA
Гость
« Ответ #1 : Апрель 13, 2010, 22:30 »

Попробуй так )
Код:
tcpSocket->write(dataForPeer);
tcpSocket->flush();
Записан
merke
Гость
« Ответ #2 : Сентябрь 22, 2010, 15:33 »

kibsoft, можете ли Вы пожалуйста, написать здесь реализацию принимающей стороны.

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

Буду очень рад помощи!
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #3 : Сентябрь 22, 2010, 17:49 »

Вот исходники того, что я тогда реализовал. fileserver - это реализация сервера, в котором запускается fileserverthread. filesender - это отправщик файлов.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
merke
Гость
« Ответ #4 : Сентябрь 22, 2010, 18:23 »

Спасибо, огромное! буду разбираться!
Записан
Scotty
Гость
« Ответ #5 : Ноябрь 11, 2010, 17:57 »

Можно поинтересоваться, а этот исходник компилируется под чем? Я попытался прикрутить этот исходник к себе в проект - масса ошибок компиляции  Грустный Даже не знаю что и делать. В частности ругается на такой код:
Код:
  FileSendFinisher::FileSendFinisher(QObject *parent=0): QObject(parent), nextBlockSize(0);
Я так и не нашел метод nextBlockSize
Записан
BRE
Гость
« Ответ #6 : Ноябрь 11, 2010, 19:35 »

Я так и не нашел метод nextBlockSize
А в переменных класса ты смотрел?  Подмигивающий
Записан
Edynchik
Гость
« Ответ #7 : Январь 04, 2011, 16:22 »

Вот исходники того, что я тогда реализовал. fileserver - это реализация сервера, в котором запускается fileserverthread. filesender - это отправщик файлов.
Не могу разобраться, в fileserver не срабатывает сигнал newconnection, и как следствие не запускается fileserverthread. filesender к другому серверу(собственно написанному подключается нормально)...помогите разобраться в чем проблема...
Записан
merke
Гость
« Ответ #8 : Январь 04, 2011, 16:39 »

http://www.prog.org.ru/index.php?topic=16260.msg108026;topicseen#new

Попробуйте данный пример
Записан
Edynchik
Гость
« Ответ #9 : Январь 13, 2011, 17:49 »

Попробуйте данный пример
Спасибо,появилось уже хоть что то, буду теперь остальное прикручивать...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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