Seite 1 von 1

QVariant über QTcpSocket

Verfasst: 11. März 2008 12:09
von NoRulez
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

Verfasst: 11. März 2008 12:14
von upsala
Man kann in einen QDataStream einen QVariant 'reinstreamen' und den QDataStream kann man an ein QIODevice anbinden (QAbstractSocket)...

Verfasst: 11. März 2008 14:59
von NoRulez
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