Russian Qt Forum
Мая 06, 2025, 16:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача данных в отдельном потоке. Сервер не успевает обработать данные.  (Прочитано 8874 раз)
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.021 секунд. Запросов: 20.