2011-10-27 2 views
14

Je suis nouveau sur QT. Je souhaite me connecter à un serveur d'écoute et transmettre des données. Je regardais les exemples disponibles, mais ils semblent avoir des fonctions supplémentaires qui ne semblent pas très utiles pour moi (se connecter, fortune, etc ..)Client QT TCP le plus simple

QTcpSocket t; 
t.connectToHost("127.0.0.1", 9000); 

En supposant que le serveur est à l'écoute et robuste .. Qu'est-ce que Je dois envoyer QByteArray de la variable "data".

Très apprécié.

Répondre

20

très simple avec QTcpSocket. Commencez comme vous l'avez fait ...

void MainWindow::connectTcp() 
{ 
    QByteArray data; // <-- fill with data 

    _pSocket = new QTcpSocket(this); // <-- needs to be a member variable: QTcpSocket * _pSocket; 
    connect(_pSocket, SIGNAL(readyRead()), SLOT(readTcpData())); 

    _pSocket->connectToHost("127.0.0.1", 9000); 
    if(_pSocket->waitForConnected()) { 
     _pSocket->write(data); 
    } 
} 

void MainWindow::readTcpData() 
{ 
    QByteArray data = pSocket->readAll(); 
} 

Soyez conscient, cependant, que pour la lecture de la TCPSocket vous pouvez recevoir les données dans plus d'une transmission, par exemple. lorsque le serveur vous envoie la chaîne "123456", vous pouvez recevoir "123" et "456". Il est de votre responsabilité de vérifier si la transmission est complète. Malheureusement, cela aboutit presque toujours à ce que votre classe soit dynamique: la classe doit se souvenir de la transmission qu'elle attend, si elle a déjà commencé et si elle est complète. Jusqu'à présent, je n'ai pas trouvé un moyen élégant de contourner cela.

+0

Bien obligé Robin, pourriez-vous fournir un code pour recevoir des données? –

+0

Bien sûr. J'ai édité ma réponse en conséquence. – Robin

+0

Merci monsieur !! –

5

Dans mon cas, je lisais des données XML, et parfois je ne recevrais pas tous dans un paquet. Voici une solution élégante. WaitForReadyRead peut également avoir un délai d'expiration et puis une vérification d'erreur supplémentaire dans le cas où le délai d'attente est atteint. Dans mon cas, je ne devrais jamais recevoir un fichier XML incomplet, mais si cela arrivait ce serait verrouiller le fil vers le haut indefinetly sans délai d'attente:

while(!xml.atEnd()) { 

    QXmlStreamReader::TokenType t = xml.readNext(); 

    if(xml.error()) { 
     if(xml.error() == QXmlStreamReader::PrematureEndOfDocumentError) { 
      cout << "reading extra data" << endl; 
      sock->waitForReadyRead(); 
      xml.addData(sock->readAll()); 
      cout << "extra data successful" << endl; 
      continue; 
     } else { 
      break; 
     } 
    } 
    ... 
+0

bonne réponse. Merci beaucoup à l'homme. – Taz742