2015-06-14 1 views
0

По какой-то причине мне нужно использовать блокирующий вызов для выполнения доступа к изображениям с сервера Google. Однако QNetworkAccessManager кажется асинхронным, хотя вокруг много работы, например вызов eventLoop.exec(); многие люди в Интернете предложили мне не делать этого.Qt: Использовать сокет tcp для получения изображения карты Google?

Так что я пытаюсь использовать 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 обеспечивает только транспортный механизм. Поскольку вы пытаетесь связаться с веб-сервером, вы должны составить 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 части.

EDIT: TCP передает ответ, разделенный на куски. При таком подходе вы не сможете получить весь ответ, так как вы пытаетесь его получить за один раз.

Вы должны изучить заголовок Content-Length и дождаться получения определенного количества байтов.

+0

Это отличный ответ! Спасибо, могу я спросить, как я могу извлечь imagedata? – Nyaruko

Смежные вопросы