最简单的QT TCP客户端

17

我想连接到一个监听服务器并传输一些数据。我看了可用的示例,但它们似乎有一些额外的功能对我来说并不是很有帮助(例如connect、fortune等)。这是我目前的代码:

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

假设服务器正在侦听并且非常稳定,那么我需要实现什么来发送一个数据变量,其数据类型为 QByteArray
2个回答

25

使用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”。你有责任检查传输是否完整。不幸的是,这几乎总是导致你的类具有状态:类必须记住它期望的传输内容、是否已经开始以及传输是否完成。到目前为止,我还没有找到一种优雅的解决方法。


非常感谢,罗宾。你能提供一些接收数据的代码吗? - user990246
这段代码将只是main.cpp或mainwindow.cpp的一部分吗?此外,是否有任何需要考虑的头文件? - readytotaste
@adivk:从 void MainWindow:: 可以看出这些方法属于 MainWindow 类。因此,它们应该在 mainwindow.cpp 中,并且您还需要在 mainwindow.h 中添加声明。至于头文件,您可能需要包括 #include <QByteArray>#include <QTcpSocket>。请注意,这个帖子已经有4.5年的历史了,上面的代码可能是使用Qt4.2编写的。如果您使用不同的Qt版本,则细节可能会有所不同。 - Robin
在 main.cpp 文件中,我需要设置客户端相关的任何内容吗? - readytotaste
@adivk:看起来你有一些特定的想法超出了这个问题的范围。为什么不将你的问题发布为一个新问题呢?你可能会惊讶地发现得到高质量答案的速度是多么快!(不要在评论中发布问题。) - Robin

5

在我的情况下,我正在阅读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;
        }
    }
    ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接