Klient/Server - kłopot z przesyłem danych (QString)

0

Bez zbędnego rozpisywania.. problem przedstawiam bezpośrednio 'na kodzie':

we: "play" (QString)
wy: "play" (a otrzymuje pusty string... przy którejś tam próbie 'naprawienia' otrzymywałem przez moment kilka znaków zapytania..)

 
// klient
void Widget::ReceiveData()
{
    // ta 'metoda' działa..
    //QByteArray in = client.readAll();
    //QString data(in);

    // ta nie bardzo..
    QDataStream in(&client);
    in.setVersion(QDataStream::Qt_4_0);

    if (dataSize == 0) { //dataSize - qint16
        if (client.bytesAvailable() < (int)sizeof(quint16))
            return;

        in >> dataSize;
   }

    if (client.bytesAvailable() < dataSize)
        return;

    QString rec;
    in >> rec;

    qDebug() << rec;
}
 
// serwer
void Widget::SendData()
{
    //to 'metoda' działa
    //client->write("play",4);

    //ta nie bardzo..
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
    out << (quint16)0;
    out << "play";
    out.device()->seek(0);
    out << (quint16)(block.size() - sizeof(quint16));

    client->write(block);
    client->disconnectFromHost();
    client->waitForDisconnected();
}

Jeszcze dziwniejsze jest to, że kod jest 'praktycznie' przeklejony z przykładu Fortune ( http://qt-project.org/doc/qt-5/qtnetwork-fortuneclient-example.html ) i ten przykład działa jak należy.. -.-

0

Ekhm, po co w ogóle używasz QDataStream? Ta klasa służy do serializacji obiektów. Chcesz wysyłać / odbierać dane przez sockety, to używaj zwyczajnie metod w stylu read / write.

1

Od rana usiadłem do tego problemu i znalazłem rozwiązanie na stronie ( http://qt-project.org/forums/viewthread/25609 )

@Lord Darkstorm - używam QDataStream, ponieważ jest to wykorzystywane w dokumentacji.. W przypadku gdy wysyłam string'a o krótkiej długości to można wykorzystywać readAll(), ale przy większych plikach do bufforowania danych, w znalezionych przeze mnie przykładach, zawsze były wykorzystywane strumienie..

W 'starszym' kodzie, raz znalazłem coś takiego: (co pewnie też zda egzamin..)

 
    int bytes = Socket->bytesAvailable();

    char *buf = new char[bytes];
    Socket->read(buf,bytes);
    socketData->append(buf,bytes);

Jednak zazwyczaj znajdowałem informację, żeby wykorzystywać strumienie..

1 użytkowników online, w tym zalogowanych: 0, gości: 1