最简单的QT TCP客户端

问题描述 投票:0回答:2

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

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

假设服务器正在监听并且稳健,我需要实现什么来发送数据类型为

QByteArray
的数据变量?

c++ c qt network-programming
2个回答
26
投票

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


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;
        }
    }
    ...
© www.soinside.com 2019 - 2024. All rights reserved.