Le client TCP QT le plus simple

Je souhaite me connecter à un serveur d’écoute et transmettre des données. J’ai examiné les exemples disponibles, mais ils semblent avoir des fonctions supplémentaires qui ne me semblent pas très utiles (connexion, fortune , etc.). C’est le code que j’ai jusqu’à présent:

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

En supposant que le serveur écoute et soit robuste, que dois-je implémenter pour envoyer une variable de données avec le type de données QByteArray ?

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(); } 

Sachez cependant que pour lire du TcpSocket, vous pouvez recevoir les données en plusieurs transmissions, c.-à-d. 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 a presque toujours pour conséquence que votre classe soit à l’état dynamic: la classe doit se souvenir de la transmission à laquelle elle s’attend, si elle a déjà commencé et si elle est complète. Jusqu’à présent, je n’ai pas trouvé de solution élégante à ce problème.

Dans mon cas, je lisais des données XML et parfois je ne pouvais pas tout avoir en un seul paquet. Voici une solution élégante. WaitForReadyRead peut également avoir un délai d’expiration, puis une vérification d’erreur supplémentaire au cas où ce délai est atteint. Dans mon cas, je ne devrais jamais recevoir un fichier xml incomplet, mais si cela se produisait, le thread serait verrouillé indéfiniment sans délai d’expiration:

 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; } } ...