2011-10-27 31 views
14

Soy nuevo en QT .. Me gustaría conectarme a un servidor de escucha y transmitir algunos datos. Miré a los ejemplos disponibles, pero parece que tienen funciones adicionales que no parecen muy útil para mí (conectar, fortuna, etc ..)Cliente QT TCP más simple

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

Suponiendo que el servidor está escuchando y robusto .. Qué hacer Necesito enviar QByteArray de la variable "datos".

Muy apreciado.

Respuesta

20

muy simple con QTcpSocket. Comience como lo hizo ...

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

Tenga en cuenta, sin embargo, que para la lectura de la TcpSocket puede recibir los datos en más de una transmisión, es decir. cuando el servidor le envía la cadena "123456", puede recibir "123" y "456". Es su responsabilidad verificar si la transmisión está completa. Desafortunadamente, esto casi siempre da como resultado que su clase tenga estado: la clase debe recordar qué transmisión está esperando, si ya ha comenzado y si está completa. Hasta ahora, no he encontrado una manera elegante de evitar eso.

+0

Muy agradecido Robin, ¿podría proporcionar algo de código para recibir datos? –

+0

Claro. Edité mi respuesta en consecuencia. – Robin

+0

¡Gracias, señor! –

5

En mi caso, estaba leyendo datos XML, y a veces no obtengo todo en un paquete. Aquí hay una solución elegante. WaitForReadyRead también podría tener un tiempo de espera en él y , y luego se verificará algún error adicional en caso de que se alcance el tiempo de espera. En mi caso nunca debería recibir un xml incompleta, pero si lo hizo suceder esto sería bloquear el hilo hacia arriba indefinetly sin el tiempo de espera:

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

buena respuesta. muchas gracias hombre – Taz742