QT 5使用QNetworkAccessManager类遇到的问题

QT 5使用QNetworkAccessManager类来处理各种协议的请求,包括http协议,ftp协议等,通常和QUrl,QNetworkRequest配合使用。

一个典型的应用场景的代码如下:

 QUrl url;
QNetworkAccessManager mgr;

//初始化url
url.setScheme("http");
url.setHost(xx);
url.setPort(xx);
url.setPath(xx);
url.setQuery(xx);

//发送HTTP GET请求
mgr.get(QNetworkRequest(url));

//当HTTP server的response结束时,发出finished信号,交给read函数处理
connect ( mgr, SIGNAL(finished(QNetworkReply*)), this, SLOT(read(QNetworkReply*)));

read函数通常是这样的

int MyTestClass::read(QNetworkReply* reply)
{
    if (reply->error() == QNetworkReply::NoError)
    {
         //read some thing
    }
    else {
        // 出现错误,打印出来,方便调试解决
        QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
        //statusCodeV是HTTP服务器的相应码,reply->error()是Qt定义的错误码,可以参考QT的文档
        qDebug( "found error ....code: %d %d\n", statusCodeV.toInt(), (int)reply->error());
        qDebug(qPrintable(reply->errorString()));
        return -1;
    }
    return 0;
}

上面的代码在大部分情况下可以工作的很好,因为通常情况下,HTTP请求的是一个页面,HTTP server会把请求的数据发给client,发送完成后,就会触发finished信号,然后交给read函数来处理。

但有的时候,我们需要请求一个永远不会finish的资源,例如一个直播流,或者下载一个很大的文件时,使用finished信号不太合适,这时,需要使用QNetworkReply的readyRead信号。

代码示例如下:

 QUrl url;
QNetworkAccessManager mgr;

//初始化url
url.setScheme("http");
url.setHost(xx);
url.setPort(xx);
url.setPath(xx);
url.setQuery(xx);

//发送HTTP GET请求
reply = mgr.get(QNetworkRequest(url));

//当HTTP server的response结束时,发出finished信号,交给read函数处理
connect ( mgr, SIGNAL(readyRead()), this, SLOT(read()));

这里的read函数和上面的read函数稍有不同,这个read函数没有参数,需要把reply保存在类中,在read函数中使用。

你可能感兴趣的:(QT 5使用QNetworkAccessManager类遇到的问题)