Seite 1 von 1

Server/Client senden/empfangen

Verfasst: 25. März 2010 17:02
von Ozzy
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!!!

Verfasst: 25. März 2010 17:59
von Christian81
Und wo fängst Du ab wenn neue Daten kommen (QTcpSocket, Signal bytesAvailable) ?

Verfasst: 25. März 2010 20:44
von Ozzy
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?

Verfasst: 25. März 2010 20:48
von Christian81
Ich würde mir mal das FortuneClient - Example anschauen...

Verfasst: 25. März 2010 20:50
von Ozzy
Moin,

meinst Du zufällig das hier?

connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readFortune()));

Dann werde ich mir das mal etwas genauer ansehen...

Verfasst: 26. März 2010 09:06
von Ozzy
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?

Verfasst: 26. März 2010 09:10
von Christian81
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!

Verfasst: 26. März 2010 10:15
von Ozzy
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...

Verfasst: 26. März 2010 10:41
von Christian81
Zum dritten Mal - QTcpSocket arbeitet asynchron. Du kannst noch nichts senden solange der Socket nicht connected ist...

Verfasst: 26. März 2010 11:42
von Ozzy
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.

Verfasst: 26. März 2010 11:56
von Christian81
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?

Verfasst: 26. März 2010 13:52
von Ozzy
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!!!