2015-06-14 31 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