이것은 순수한 테스트 목적 및 호기심 때문입니다. 내 DataDownloader 클래스를 사용하여 서버에서 데이터 목록을 가져옵니다. http://tiny-file-url, http://big-file-url과 같은 다른 URL에서 작동합니다. 그러나 두 개의 동일한 URL (http://tiny-file-url, http://tiny-file-url)을 전달하고 http://tiny-file-url의 데이터가 매우 작 으면 QNetworkAccessManager의 두 번째 응답이 비어 있습니다. 그러나 두 http://big-file-url가 작동하는 것 같습니다. 같은 URL에서 작은 데이터를 요청할 때 QNetworkAccessManager가 마술을하는지 궁금합니다. Qt 문서 사이트에서 관련 정보를 얻지 못하는 것 같습니다.QT QNetworkReply readAll은 같은 URL을 다시 요청할 때 비어있는 것을 반환합니다.
여기 내 DataDownloader
클래스 :
class DataDownloader : public QObject
{
Q_OBJECT
public:
explicit DataDownloader(QObject* parent = 0);
virtual ~DataDownloader();
QByteArray data() const;
void cancel();
void download(QUrl url);
signals:
void isComplete();
private slots:
void complete(QNetworkReply* reply);
private:
QNetworkAccessManager m_NetworkManager;
QByteArray m_Data;
QNetworkReply* m_pReply;
};
DataDownloader::DataDownloader(QUrl url, QObject* parent) :QObject(parent)
{
connect(&m_NetworkManager, SIGNAL(finished(QNetworkReply*)),
SLOT(complete(QNetworkReply*)));
}
DataDownloader::~DataDownloader()
{
}
void DataDownloader::complete(QNetworkReply* reply)
{
// in the first download it returns data
// but the second time m_Data is empty
m_Data = reply->readAll();
reply->deleteLater();
if (!m_Data.isEmpty()) {
// no signal on the second try
emit isComplete();
}
}
QByteArray DataDownloader::data() const
{
return m_Data;
}
void DataDownloader::cancel()
{
m_pReply->abort();
}
void DataDownloader::download(QUrl url)
{
QNetworkRequest request(url);
m_pReply = m_NetworkManager.get(request);
}
이 DataDownloader
은 다음과 같습니다 호출하는 코드 :
void PluginManager::downloadPlugins()
{
m_DownloadIndex++;
savePlugin();
if (m_DownloadIndex < m_PluginList.size()) {
QUrl url;
// alway return the same url here
QString pluginUrl = getPluginUrl(m_PluginList.at(m_DownloadIndex));
url.setUrl(pluginUrl);
if (m_pPluginDownloader == NULL) {
m_pPluginDownloader = new DataDownloader();
// call this function again when isComplete is signaled
connect(m_pPluginDownloader, SIGNAL(isComplete()), this, SLOT(downloadPlugins()));
}
m_pPluginDownloader->download(url);
}
}
오늘의 임의 코드 제안 : 다운로더 당 하나가 아닌 단지 하나의'QNetworkAccessManager'를 만드는 것이 훨씬 더 좋은 생각입니다. – peppe
BTW, http : // tiny-file-url은 항상 예상대로 작동합니까? – alediaferia
데이터를 파일 (디버그 텍스트 포함)로 다운로드하고 편집기로 열 수 있기 때문에 나는 이에 대해 확신합니다. – Jerry