最简单的QT TCP客户端

我想连接到监听服务器并传输一些数据。 我查看了可用的示例,但它们似乎有额外的function,对我来说似乎没有什么帮助(即连接, 财富等)。 这是我到目前为止的代码:

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

假设服务器正在监听并且健壮,那么我需要实现什么来发送数据类型为QByteArray的数据变量?

使用QTcpSocket非常简单。 从你做起……

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

但请注意,对于从TcpSocket读取,您可能会收到多个传输中的数据,即。 当服务器发送字符串“123456”时,您可能会收到“123”和“456”。 您有责任检查传输是否完整。 不幸的是,这几乎总会导致你的class级有状态:class级必须记住它所期望的传输,是否已经启动以及它是否已经完成。 到目前为止,我还没有想出一个优雅的方法。

在我的情况下,我正在读取xml数据,有时我不会在一个数据包中得到所有数据。 这是一个优雅的解决方案。 WaitForReadyRead也可能有一个超时,然后在达到超时的情况下进行一些额外的错误检查。 在我的情况下,我永远不应该收到一个不完整的xml,但如果它确实发生这将在没有超时的情况下无限制地锁定线程:

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