2011-10-27 1 views
14

Sono nuovo a QT. Vorrei connettermi a un server di ascolto e trasmettere alcuni dati. Ho guardato gli esempi disponibili, ma sembrano avere funzioni extra che non sembrano molto utile per me (collegare, fortuna, ecc ..)Client TCP QT più semplice

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

Supponendo che il server è in ascolto e robusto .. Cosa fare Devo inviare QByteArray della variabile "data".

Molto apprezzato.

risposta

20

molto semplice con QTcpSocket. Inizia come avete fatto ...

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

essere consapevoli, però, che per la lettura dal TCPSocket è possibile ricevere i dati in più di una trasmissione, vale a dire. quando il server ti invia la stringa "123456" potresti ricevere "123" e "456". È tua responsabilità controllare se la trasmissione è completa. Sfortunatamente, questo comporta quasi sempre che la classe sia stata dichiarata: la classe deve ricordare quale trasmissione si aspetta, se è già stata avviata e se è completa. Finora, non ho trovato un modo elegante attorno a questo.

+0

Molto obbligato Robin, potrebbe fornire qualche codice per la ricezione dei dati? –

+0

Sicuro. Ho modificato la mia risposta di conseguenza. – Robin

+0

Grazie signore !! –

5

Nel mio caso stavo leggendo dati xml, e a volte non avrei ottenuto tutto in un unico pacchetto. Ecco una soluzione elegante. WaitForReadyRead potrebbe anche avere un timeout in esso e quindi qualche errore in più nel caso in cui venga raggiunto il timeout. Nel mio caso non avrei mai ricevere un xml incompleta, ma se lo ha fatto accadere questo sarebbe bloccare il filo fino indefinitamente senza il timeout:

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

buona risposta. molte grazie – Taz742