2017-09-27 3 views
1

Ich schreibe Client/Server-Kommunikationssystem auf Qt. Ich verwende QTcpServer und QtcpSocket. Ich sende einige Informationen von der Clientseite, aber wie kann ich den Wert vom Server zurückgeben?QTcpServer: Wie gibt man einen Wert zurück?

Client Side

QTcpSocket *socket = new QTcpSocket(this); 
socket->connectToHost("MyHost", "MyPort"); 
socket->write("Hello from Client..."); 

Server Side

QtSimpleServer::QtSimpleServer(QObject *parent) : QTcpServer(parent) 
{ 
    if (listen(QHostAddress::Any, "MyPort")) 
    { 
     qDebug() << "Listening..."; 
    } 
    else 
    { 
     qDebug() << "Error while listening... " << errorString(); 
    } 
} 

void QtSimpleServer::incomingConnection(int handle) 
{ 
    QTcpSocket *socket = new QTcpSocket(); 
    socket->setSocketDescriptor(handle); 

    connect (socket, SIGNAL(readyRead()), this, SLOT(onReadyRead())); 
} 

void QtSimpleServer::onReadyRead() 
{ 
    QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender()); 
    qDebug() << socket->readAll(); 

    socket->disconnectFromHost(); 
    socket->close(); 
    socket->deleteLater(); 
} 
+1

Sie 'socket- write' Methode> verwenden haben. Übrigens, Sie sollten beachten, dass das Paket fragmentiert sein kann, und es ist nicht garantiert, dass Sie alle Daten mit einem einzigen "readAll()" lesen werden. –

+0

Wie kann ich einen Wert vom Server zurückgeben? Welchen Wert? Möglicherweise müssen Sie den Clientzeiger für weitere – saeed

+0

@saeed speichern Zum Beispiel: Ich möchte an den Client "Hallo vom Server" senden. Wie kann ich es tun? –

Antwort

2

Speichern jeder Client-Pointer für die weitere reagieren.

QVector<QTcpSocket*> clients; 
void QtSimpleServer::incomingConnection(qintptr handle) 
{ 
    QTcpSocket *socket = new QTcpSocket(); 
    socket->setSocketDescriptor(handle); 
    connect (socket, SIGNAL(readyRead()), this, SLOT(onReadyRead())); 
    clients << socket; 
} 

void QtSimpleServer::sendHelloToAllClient() 
{ 
    foreach (QTcpSocket * client, clients) { 
     client->write(QString("Hello Client").toLatin1()); 
     client->flush(); 
    } 
} 

Hinweis:

Dies ist nur eine einfache Lösung speichert Referenz für Objekte zu zeigen, die in einem Bereich erstellt und soll später referenziert werden.

wenn Sie wollen komplexe Server/Client-Anwendung üben, ist es besser aussehen auf Threaded Fortune Server Example und Fortune Client Example

Verwandte Themen