Alles rund um die Programmierung mit Qt
NoRulez
Beiträge: 208 Registriert: 19. Juni 2007 15:43
Beitrag
von NoRulez » 11. März 2008 12:09
Hey @all,
da ich vor kurzem auf den QT Zug aufgesprungen bin und ihc mich nun etwas damit beschäftigen wollte, wollte ich mal fragen ob es möglich ist QVariant über QTcpServer/QTcpSocket zu senden? Ich würde gerne eine Client/Server kommunication haben in der ich QVariant's zwischen Client und Server hin und herschicke.
Ich habe mir auch schon die Fortune Examples angesehen, aber das schicken an den Server funktioniert nicht, da der Server nichts bekommt.
Ich hoffe es kann mir jemand helfen und vielleicht kann mir ja jemand ein kleines Beispiel zum Senden und Empfangen zeigen.
Vielen Dank im Voraus
Lg NoRulez
upsala
Beiträge: 3946 Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:
Beitrag
von upsala » 11. März 2008 12:14
Man kann in einen QDataStream einen QVariant 'reinstreamen' und den QDataStream kann man an ein QIODevice anbinden (QAbstractSocket)...
NoRulez
Beiträge: 208 Registriert: 19. Juni 2007 15:43
Beitrag
von NoRulez » 11. März 2008 14:59
Danke vielmals,
hat funktioniert, falls es jemanden hilft (aus irgendeinem Grund funktioniert quint32 nicht):
Senden:
Code: Alles auswählen
void MainWindow::sendMessage(const QString &msg, const QVariant &data) {
if(tcpSocket == NULL)
return;
if(tcpSocket->state() != QAbstractSocket::ConnectedState )
return;
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_2);
//out.setVersion( out.version() ); // set to the current Qt version
//out << (quint32) 0;
out << (quint16) 0;
out << msg;
out << data;
out.device()->seek(0);
// out << (quint32)(block.size() - sizeof(quint32));
out << (quint16)(block.size() - sizeof(quint16));
tcpSocket->write(block);
tcpSocket->flush();
}
Empfangen:
Code: Alles auswählen
void MainWindow::onReadyRead() {
if (tcpSocket == NULL)
return;
if ( tcpSocket->state() != QAbstractSocket::ConnectedState )
return;
QDataStream in(tcpSocket);
in.setVersion(QDataStream::Qt_4_2);
//in.setVersion( in.version() ); // set to the current Qt version instead
if (blockSize == 0) {
if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
return;
in >> blockSize;
reading_message = true;
}
if (tcpSocket->bytesAvailable() < blockSize)
return;
QString msgString;
QVariant msgData;
in >> msgString;
in >> msgData;
onMessage( msgString, msgData );
reading_message = false;
blockSize = 0;
if (tcpSocket->bytesAvailable() > 0)
onReadyRead();
}
Lg NoRulez