Russian Qt Forum

Qt => Работа с сетью => Тема начата: nata267 от Июль 17, 2014, 18:20



Название: SOLVED Пересылка больших файлов QTcpSocket
Отправлено: nata267 от Июль 17, 2014, 18:20
Не получается отправлять и читать большие файлы. Что я делаю не так:
Вот отправка :
Код:
void ExchangeRateClient::beginRequest()
{
    m_socket = new QTcpSocket();
    connect(m_socket, SIGNAL(connected()), this, SLOT(connectedHandle()));
    m_socket->connectToHost(m_serverAddress, m_serverPort);
}

void ExchangeRateClient::connectedHandle()
{
    if(!m_socket->isValid())
    {
        qCritical() << "Could not connect to server.  Action canceled.";
        return;
    }

    QByteArray xmlData = m_requestInfo->xml().toUtf8();
    m_xml = new QDataStream(xmlData);
    connect(m_socket, SIGNAL(bytesWritten(qint64)), this, SLOT(sendNextXmlPiece(qint64)));

    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_5_3);
    out << quint64(xmlData.size());
    m_socket->write(block);

    connect(m_socket, SIGNAL(readyRead()), this, SLOT(responseHandle()));
    connect(m_socket, SIGNAL(disconnected()), this, SLOT(disconnectedHandle()));
    connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(errorHandle(QAbstractSocket::SocketError)));
}

void ExchangeRateClient::sendNextXmlPiece(qint64 bytes)
{

    if(m_socket->bytesToWrite() >  XML_CHUNK_SIZE
            || m_xml->atEnd()) {
        delete m_xml;
        m_xml = NULL;
        return;
    }
    long int lBytes = 0;
    char buffer[XML_CHUNK_SIZE];
    buffer[XML_CHUNK_SIZE - 1] = '\0';
    int l = m_xml->readRawData(buffer, sizeof(char)* (XML_CHUNK_SIZE - 1));
    QByteArray ba(buffer, sizeof(char)*l);
    lBytes = m_socket->write(ba, sizeof(char)*l);

    qDebug() << QString(buffer);
    qDebug() << lBytes;

    m_socket->waitForBytesWritten();
}

Почему-то сигнал bytesWriten срабатыват только 1 раз



Название: Re: Пересылка больших файлов QTcpSocket
Отправлено: nata267 от Июль 17, 2014, 22:57
Вот чтение:

Код:
void ServerObject::handleConnection()
{
    m_socket = new QTcpSocket();

    if(!m_socket->setSocketDescriptor(m_socketDescriptor))
    {
        qCritical() << "QTcpSocket::setSocketDescriptor() failed, thread terminating...";
        emit finished();
        return;
    }

    connect(m_socket, SIGNAL(readyRead()), this, SLOT(readReady()));
    connect(m_socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
}

void ServerObject::readReady()

    m_write = new QDataStream(&incomingXml, QIODevice::WriteOnly);
    m_write->setVersion(QDataStream::Qt_5_3);

    QByteArray bArray;
    QDataStream dStream(&bArray, QIODevice::ReadWrite);
    dStream.setVersion(QDataStream::Qt_5_3);

    bArray = m_socket->readAll();
    dStream >> blockSize;
    qDebug() << blockSize;

    disconnect(m_socket, SIGNAL(readyRead()), 0, 0);
    connect(m_socket, SIGNAL(readyRead()), this, SLOT(dataReceive()));
}

void ServerObject::dataReceive()
{
    QByteArray tmp = m_socket->readAll();
    m_bytePosition += m_write->writeRawData(tmp.data(), tmp.size());

    qDebug() << m_bytePosition;
    qDebug() << QString::fromUtf8(incomingXml.data());

    if(m_bytePosition >= blockSize) {
        completeAndClose();
    }

}

bool ServerObject::completeAndClose()
{
    reply(invokeMethod(QString::fromUtf8(incomingXml.data())));

    m_socket->close();
    delete m_write;
    return true;
}


Название: Re: Пересылка больших файлов QTcpSocket
Отправлено: nata267 от Июль 17, 2014, 23:08
Все я уже разобралась, надо просто убрать m_socket->waitForBytesWritten(); из слота привязанного к синалу bytesWritten


Название: Re: SOLVED Пересылка больших файлов QTcpSocket
Отправлено: nata267 от Июль 18, 2014, 09:49
В ubuntu работает, а в винде нет(((


Название: Re: SOLVED Пересылка больших файлов QTcpSocket
Отправлено: Fregloin от Июль 22, 2014, 09:47
Посмотрите уже есть несколько подобных тем в разделе Сеть