crossplatform.ru

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

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Передача данных в отдельном потоке. Сервер не успевает обработать данные.
kibsoft
  опции профиля:
сообщение 14.4.2010, 14:23
Сообщение #11


Участник
**

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

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




Репутация:   2  


Цитата(BRE @ 14.4.2010, 15:08) *
Проверь несколько раз, сколько байт (какими порциями) реально читает эта функция из сокета:
void FileWriter::writeBytes(QDataStream &in)
{
    QByteArray bytes;
    in>>bytes;

    qDebug() << "Read data size from socket:" << bytes.size();

    QFile file("D:/ref.dat");
    if (file.open(QIODevice::Append)) {
        file.write(bytes);//записываем байты
        file.close();
    }
}

Read data size from socket: 1024
Read data size from socket: 0
Файл 59 Кб.
Все рушится после 2 раза вызова слота обработки (readBytes), т.е. первый раз приходит как положено 1031 байт(вместе с nextBlockSize), при следующем вызове слота в nextBlockSize появляется 30 тысяч с лишним байт (размер следующего блока), потом if(tcpSocket->bytesAvailable()<nextBlockSize) break; тут пару раз происходит выход из слота, т.к.30 тысяч байт еще не пришли, а потом выходит косяк с этим:
quint8 request;//получаем запрос
        in>>request;
        TypeOfRequest type=(TypeOfRequest)request;
        if (type==FILEBYTES) {//если данные - файл, то записываем их на жесткий диск
            writeBytes(in);
        }
в reguest вместо 0 или 1 попадает 97 вроде.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 14.4.2010, 14:34
Сообщение #12


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

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

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




Репутация:   44  


А покажи как определены: FILEBYTES, SENDING_FINISHED
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kibsoft
  опции профиля:
сообщение 14.4.2010, 14:35
Сообщение #13


Участник
**

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

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




Репутация:   2  


Цитата(BRE @ 14.4.2010, 15:34) *
А покажи как определены: FILEBYTES, SENDING_FINISHED

class FileWriter : public QObject
{
    Q_OBJECT
public:
    FileWriter(QObject *parent=0):QObject(parent),nextBlockSize(0) {};
public slots:
    void readBytes();//слот для чтения принятых данных

private:
    quint16 nextBlockSize;
    //тип запроса от клиента
    enum TypeOfRequest {FILEBYTES/*отправка частей файла*/,SENDING_FINISHED/*отправка файла завершена*/};
    //тип ответа от сервера
    enum TypeOfReply {RECEIVING_FINISHED/*окончание принятия файла*/};

    void writeBytes(QDataStream &in);//запись принятых байтов в файл
    void sendFinishMessage(QTcpSocket *tcpSocket);//отправка уведомления об окончании принятия файла
};
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 14.4.2010, 14:41
Сообщение #14


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

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

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




Репутация:   44  


Попробуй сиправить отсылку:
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) << quint8( FILEBYTES ) << byteArray;        // <<<
             out.device()->seek(0);
             out << quint16(dataForPeer.size() - sizeof(quint16));
             tcpSocket->write(dataForPeer);

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

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


Сообщение отредактировал BRE - 14.4.2010, 14:41
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kibsoft
  опции профиля:
сообщение 14.4.2010, 14:48
Сообщение #15


Участник
**

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

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




Репутация:   2  


Да я вечером уже этот глюк нашел и исправил, но все равно неправильно работает :(


Вот исходники 3 классов: сервер, поток-приемщик и отправитель. Может поможет Вам разобраться точней..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 14.4.2010, 14:54
Сообщение #16


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

Группа: Участник
Сообщений: 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();//закрываем файл
    }
}

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


Участник
**

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

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




Репутация:   2  


Цитата
Read data size from socket: 0
Read data size from socket: 0

Щас попробую сделать эту же задачу, но в GUI-потоке, посмотрю будет ли работать..

P.S. У нас День Рождения одинаковый :)

http://rghost.ru/1381290 исходники

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


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

Группа: Участник
Сообщений: 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
  опции профиля:
сообщение 14.4.2010, 15:08
Сообщение #19


Участник
**

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

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




Репутация:   2  


Вы уже это писали :) Я же сказал, что еще вчера это исправил, но все равно не работает. У меня с quint8 сейчас.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kibsoft
  опции профиля:
сообщение 14.4.2010, 16:36
Сообщение #20


Участник
**

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

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




Репутация:   2  


BRE, спасибо за разные подсказки! Сейчас посидел, подумал - неправильно вообще я алгоритм организовал, понял в чем дело, буду перерабатывать. Загвоздка как раз в типе запроса(request).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




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