2015-06-14 57 views
0

出於某種原因,我需要使用阻止調用從谷歌的服務器執行圖像訪問。 但是,QNetworkAccessManager似乎是異步的,儘管有很多解決方法,比如調用eventLoop.exec();很多人在網上建議我不要這樣做。Qt:使用tcp socket獲取谷歌地圖圖片?

所以我想使用TCP Socekt。 我想在這裏訪問圖像:

http://mt1.google.com/vt/lyrs=y&x=0&y=0&z=0

這裏是我的代碼:

socket = new QTcpSocket(this); 

    socket->connectToHost("mt1.google.com", 80, QIODevice::ReadWrite); 

    if(socket->waitForConnected(5000)) 
    { 
     qDebug() << "Connected!"; 

     // send 
     socket->write("/vt/lyrs=y&x=0&y=0&z=0"); 
     socket->waitForBytesWritten(1000); 
     socket->waitForReadyRead(3000); 

     qDebug() << "Reading: " << socket->bytesAvailable(); 

     // get the data 
     qDebug() << socket->readAll(); 

     // close the connection 
     socket->close(); 
    } 
    else 
    { 
     qDebug() << "Not connected!"; 
    } 

但似乎在所有的工作?我應該通過tcp套接字來獲取圖像?

+0

Google服務器等待來自您的http請求。您需要實現http協議才能從tcp套接字獲取映像。 – Milovidov

回答

1

TCP只提供傳輸機制。由於您嘗試與Web服務器通信,因此您應該編寫HTTP消息。

替換行

socket->write("/vt/lyrs=y&x=0&y=0&z=0"); 

socket->write("GET /vt/lyrs=y&x=0&y=0&z=0 HTTP/1.1\r\nHost: mt1.google.com\r\nUser-Agent: TestAgent\r\n\r\n"); 

,你應該得到如下回應:

HTTP/1.1 200 OK 
Date: Sun, 14 Jun 2015 14:24:40 GMT 
Expires: Sun, 14 Jun 2015 14:24:40 GMT 
Cache-Control: private, max-age=3600 
Access-Control-Allow-Origin: * 
Content-Type: image/jpeg 
X-Content-Type-Options: nosniff 
Server: paintfe 
Content-Length: 10790 
X-XSS-Protection: 1; mode=block 
X-Frame-Options: SAMEORIGIN 
Alternate-Protocol: 80:quic,p=0 

IMAGEDATA 

解析響應並提取IMAGEDATA部分。

編輯:TCP提供分成塊的響應。採用這種方法後,您將無法收到整個回覆,因爲您試圖一次性收到回覆。

您應該檢查Content-Length標題並等待,直到收到指定數量的字節。

+0

這是一個很好的答案!謝謝,我可以問我如何提取圖像數據? – Nyaruko