crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Передача данных в отдельном потоке. Сервер не успевает обработать данные.
kibsoft
  опции профиля:
сообщение 13.4.2010, 20:29
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

Спасибо сказали: 14 раз(а)




Репутация:   2  


Есть сервер и клиент (отсылает данные, например файл):
Клиент:
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 сокета, но видимо данные приходят так быстро, что сервер не успевает сделать нужные действия (а именно записать на диск). Что можно придумать? Можно ли как то на клиенте узнать считаны ли данные сервером или нет(и ждать этого момента)? В голову приходит только одно: от сервера высылать уведомление о принятых данных, чтобы клиент мог дальше передавать их (но мне кажется, что что-то не то).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
BRE
  опции профиля:
сообщение 14.4.2010, 14:54
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Попробуй изменить так:
void FileSender::sendFile()
{
    QFile file(filePath);
    if (file.open(QIODevice::ReadOnly)) {//если файл открылся
        while(!file.atEnd()) {//пока не конец файла
             QByteArray byteArray=file.read(1024);//читаем по килобайту

             QByteArray dataForPeer;//массив для данных
             QDataStream out(&dataForPeer, QIODevice::WriteOnly);//выходной поток
             out << quint16(0) << FILEBYTES << byteArray;
             out.device()->seek(0);
             out << quint16(dataForPeer.size() - sizeof(quint16));
             tcpSocket->write(dataForPeer);
        }
        //отправка уведомления об окончании передачи файла
        QByteArray dataForPeer;//массив для данных
        QDataStream out(&dataForPeer, QIODevice::WriteOnly);//выходной поток
        out << quint16(0) << SENDING_FINISHED;
        out.device()->seek(0);
        out << quint16(dataForPeer.size() - sizeof(quint16));
        tcpSocket->write(dataForPeer);

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

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 14.4.2010, 15:05
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Блин, quint8 забыл добавить:
void FileSender::sendFile()
{
    QFile file(filePath);
    if (file.open(QIODevice::ReadOnly)) {//если файл открылся
        while(!file.atEnd()) {//пока не конец файла
             QByteArray byteArray=file.read(1024);//читаем по килобайту

             QByteArray dataForPeer;//массив для данных
             QDataStream out(&dataForPeer, QIODevice::WriteOnly);//выходной поток
             out << quint16(0) << quint8( FILEBYTES ) << byteArray;
             out.device()->seek(0);
             out << quint16(dataForPeer.size() - sizeof(quint16));
             tcpSocket->write(dataForPeer);
        }
        //отправка уведомления об окончании передачи файла
        QByteArray dataForPeer;//массив для данных
        QDataStream out(&dataForPeer, QIODevice::WriteOnly);//выходной поток
        out << quint16(0) << quint8( SENDING_FINISHED );
        out.device()->seek(0);
        out << quint16(dataForPeer.size() - sizeof(quint16));
        tcpSocket->write(dataForPeer);

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


P.S. Ты бы проект сбросил, что бы его собрать можно было. А то гадать уже надоело. :)

Сообщение отредактировал BRE - 14.4.2010, 15:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- kibsoft   Передача данных в отдельном потоке. Сервер не успевает обработать данные.   13.4.2010, 20:29
- - BRE   Покажи как читаются данные на другой стороне.   13.4.2010, 20:40
|- - kibsoft   /* Слот для обработки принятых из сокета данных....   13.4.2010, 20:43
|- - BRE   Проверь несколько раз, сколько байт (какими порция...   14.4.2010, 14:08
|- - kibsoft   Цитата(BRE @ 14.4.2010, 15:08) Проверь не...   14.4.2010, 14:23
- - BRE   Посмотри примеры еще раз и обрати внимание на то, ...   13.4.2010, 20:49
|- - kibsoft   Цитата(BRE @ 13.4.2010, 21:49) Посмотри п...   13.4.2010, 21:02
- - BRE   Может быть не так, алгоритм Нагла думаю включен, п...   13.4.2010, 21:05
|- - kibsoft   Цитата(BRE @ 13.4.2010, 22:05) Может быть...   14.4.2010, 0:03
- - BRE   А не нужно отключать алгоритм Нагла, нужно придерж...   14.4.2010, 6:49
|- - kibsoft   Цитата(BRE @ 14.4.2010, 7:49) А не нужно ...   14.4.2010, 13:21
- - BRE   А покажи как определены: FILEBYTES, SENDING_FINISH...   14.4.2010, 14:34
|- - kibsoft   Цитата(BRE @ 14.4.2010, 15:34) А покажи к...   14.4.2010, 14:35
- - BRE   Попробуй сиправить отсылку: void FileSender:...   14.4.2010, 14:41
|- - kibsoft   Да я вечером уже этот глюк нашел и исправил, но вс...   14.4.2010, 14:48
- - BRE   Попробуй изменить так: void FileSender::se...   14.4.2010, 14:54
|- - kibsoft   ЦитатаRead data size from socket: 0 Read data siz...   14.4.2010, 15:02
|- - BRE   Блин, quint8 забыл добавить: void FileSender:...   14.4.2010, 15:05
- - kibsoft   Вы уже это писали Я же сказал, что еще вчера это ...   14.4.2010, 15:08
- - kibsoft   BRE, спасибо за разные подсказки! Сейчас посид...   14.4.2010, 16:36
- - kibsoft   QFile file(filePath); if (file.open...   16.4.2010, 0:25
- - BRE   Посмотри эту тему, там я выкладывал архивы с тесто...   16.4.2010, 7:07
|- - kibsoft   Цитата(BRE @ 16.4.2010, 8:07) Посмотри эт...   16.4.2010, 19:14
|- - BRE   Цитата(kibsoft @ 16.4.2010, 20:14) Спасиб...   16.4.2010, 19:19
|- - kibsoft   ЦитатаСтек TCP сам будет этим рулить, в зависимост...   16.4.2010, 19:28
- - Litkevich Yuriy   Цитата(kibsoft @ 16.4.2010, 23:28) после ...   16.4.2010, 19:37
|- - kibsoft   Цитата(Litkevich Yuriy @ 16.4.2010, 20:37...   16.4.2010, 19:46
- - BRE   Без кода я затрудняюсь ответить.   16.4.2010, 19:39


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.11.2024, 7:48