Alles rund um die Programmierung mit Qt
Ozzy
Beiträge: 141 Registriert: 24. Oktober 2007 10:18
Beitrag
von Ozzy » 25. März 2010 17:02
Moin,
ich probiere gerade etwas mit dem Server/Client Example rum, und probiere, dass auch der Client etwas sendet und der Server etwas empfängt. Ich hatte den Server jetzt so geändert:
Code: Alles auswählen
QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
connect(clientConnection, SIGNAL(disconnected()),
clientConnection, SLOT(deleteLater()));
QByteArray incomingData;
if (clientConnection->bytesAvailable()) {
incomingData = clientConnection->readAll();
std::cout << "data" << std::endl;
qDebug (incomingData);
}
//if (incomingData[0] == 1) ;
clientConnection->write(block);
und den Client:
Code: Alles auswählen
void Client::readFortune()
{
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << "Hello Server";
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
tcpSocket->write(block);
QDataStream in(tcpSocket);
in.setVersion(QDataStream::Qt_4_0);
....
Könnt Ihr mir sagen, was da falsch ist?
MfG, und vielen Dank im Voraus!!!
Christian81
Beiträge: 7319 Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:
Beitrag
von Christian81 » 25. März 2010 17:59
Und wo fängst Du ab wenn neue Daten kommen (QTcpSocket, Signal bytesAvailable) ?
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
Ozzy
Beiträge: 141 Registriert: 24. Oktober 2007 10:18
Beitrag
von Ozzy » 25. März 2010 20:44
Moin,
hm, einen slot habe ich dafür nicht. Dachte, wenn sich der Client auf den Server verbindet, dann geht das auch so, wie ich das oben für den Server geschrieben habe. Also einfach nur einen neuen Slot und fertig?
Christian81
Beiträge: 7319 Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:
Beitrag
von Christian81 » 25. März 2010 20:48
Ich würde mir mal das FortuneClient - Example anschauen...
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
Ozzy
Beiträge: 141 Registriert: 24. Oktober 2007 10:18
Beitrag
von Ozzy » 25. März 2010 20:50
Moin,
meinst Du zufällig das hier?
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readFortune()));
Dann werde ich mir das mal etwas genauer ansehen...
Ozzy
Beiträge: 141 Registriert: 24. Oktober 2007 10:18
Beitrag
von Ozzy » 26. März 2010 09:06
Moin,
ich bekomme es leider nicht hin. Der Server ruft ja beim connecten "sendFortune" auf. Darin wird ja auch ein Socket erstellt, dem ich jetzt noch ein neues Signal zugewiesen habe:
Code: Alles auswählen
QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
connect(clientConnection, SIGNAL(readyRead()), this, SLOT(receiveMessage()));
Beim Empfänger sieht das jetzt so aus:
Code: Alles auswählen
void Client::requestNewFortune()
{
getFortuneButton->setEnabled(false);
blockSize = 0;
tcpSocket->abort();
tcpSocket->connectToHost(hostLineEdit->text(),
portLineEdit->text().toInt());
tcpSocket->write("Test");
}
Aber der Slot beim Server wird nie aufgerufen. Warum denn nicht?
Christian81
Beiträge: 7319 Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:
Beitrag
von Christian81 » 26. März 2010 09:10
Du solltes beim Client schon warten bis er connected ist würde ich sagen. Du kannst nicht einfach davon ausgehen dass er sofort connected ist - das läuft alles asynchron ab!
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
Ozzy
Beiträge: 141 Registriert: 24. Oktober 2007 10:18
Beitrag
von Ozzy » 26. März 2010 10:15
Moin,
hab es jetzt so ausprobiert, funktioniert aber immer noch nicht:
Code: Alles auswählen
void Client::requestNewFortune()
{
getFortuneButton->setEnabled(false);
blockSize = 0;
tcpSocket->abort();
tcpSocket->connectToHost(hostLineEdit->text(),
portLineEdit->text().toInt());
if (tcpSocket->isWritable())
tcpSocket->write("Test");
}
Das SIGNAL(readyRead()) wird wohl beim Server nicht ausgelöst... Der Code vom Server sieht jetzt so aus:
Code: Alles auswählen
void Server::sendFortune() {
std::cout << "sendFortune" << std::endl;
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << fortunes.at(rand() % fortunes.size());
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
connect(clientConnection, SIGNAL(readyRead()), this, SLOT(receiveMessage()));
connect(clientConnection, SIGNAL(disconnected()),
clientConnection, SLOT(deleteLater()));
clientConnection->write(block);
clientConnection->disconnectFromHost();
}
Verstehe echt nicht, woran es hängt...
Christian81
Beiträge: 7319 Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:
Beitrag
von Christian81 » 26. März 2010 10:41
Zum dritten Mal - QTcpSocket arbeitet asynchron. Du kannst noch nichts senden solange der Socket nicht connected ist...
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
Ozzy
Beiträge: 141 Registriert: 24. Oktober 2007 10:18
Beitrag
von Ozzy » 26. März 2010 11:42
Moin,
also selbst wenn ich ein Signal
Code: Alles auswählen
connect(tcpSocket, SIGNAL( connected() ), this, SLOT(connectedTotServer() ) );
hinzufüge, und dann erst sende funktioniert es auch nicht.
Dann gib mir doch bitte ein Beispiel, wie es funktioniert, oder welche Abfrage ich machen muss oder auf welches Signal ich warten muss.
Christian81
Beiträge: 7319 Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:
Beitrag
von Christian81 » 26. März 2010 11:56
Wenn Du innerhalb von connectedTotServer() etwas sendest kommt es auch beim Server an.
Auf deinem Server machst Du zwar eine Verbindung zur readyRead(), schliesst aber danach sofort die Verbindung - wie soll danach noch was ankommen?
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
Ozzy
Beiträge: 141 Registriert: 24. Oktober 2007 10:18
Beitrag
von Ozzy » 26. März 2010 13:52
Stimmt, jetzt kommt auch etwas an. Jetzt muss ich das ganze nur noch mal etwas umbauen, dass sie sich nicht jedes Mal neu connecten, sondern die Kommunikation aufrechterhalten bleibt.
Aber vielen Dank noch einmal für Deine Hilfe!!!