QVariant über QTcpSocket

Alles rund um die Programmierung mit Qt
Antworten
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

QVariant über QTcpSocket

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

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 »

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
Antworten