Получить время выполнения http запроса

У меня есть следующий код:

void GameScene::onGetServersRequestCompleted( cocos2d::network::HttpClient *sender, cocos2d::network::HttpResponse *response )
{

if( 200 == response->getResponseCode() ) {
std::vector<char> *buffer = response->getResponseData();
std::string serversString( buffer->begin(), buffer->end() );

Json::Reader reader;
Json::Value root;

reader.parse(serversString, root);

const Json::Value servers = root["servers"];
for ( int i = 0; i < servers.size(); ++i ) {
//CCLOG("%s",  servers[i].asString().c_str());
cocos2d::network::HttpRequest *request = new cocos2d::network::HttpRequest();
request->setUrl("http://" + servers[i].asString() + "/info");
request->setRequestType(cocos2d::network::HttpRequest::Type::GET);
request->setResponseCallback(CC_CALLBACK_2(GameScene::onServerRequestCompleted, this));
cocos2d::network::HttpClient::getInstance()->send(request);
request->release();
}

} else {
CCLOG("Request Failed! Response Code: %i\n", response->getResponseCode());
/*std::vector<char> *buffer = response->getResponseData();
std::string serversString( buffer->begin(), buffer->end() );
CCLOG("%s", serversString.c_str());*/
this->serverIp = "185.8.166.41";
}

}

Я пытаюсь получить правильный сервер. Что я хотел бы сделать, это получить время выполнения запроса каждого сервера и получить самый быстрый. Является ли это возможным? потому что это асинхронная функция, я не знаю, как это сделать. Как бы вы это сделали?

0

Решение

Это помогает? Из документации
HTTPRequest а также HTTPResponse ….

Вы можете установить строковый тег для идентификации вашего запроса, этот тег можно найти в HttpResponse-> getHttpRequest-> getTag ()

    void HTTPRequest::setTag(const char *tag);

Верните строковый тег для идентификации запроса.
Лучше всего использовать его в вашем обратном вызове MyClass :: onMyHttpRequestCompleted (sender, HttpResponse *)

    const char* HTTPResponse::getTag();

Редактировать: Вы можете использовать эти уникальные теги для объединения запросов с асинхронными ответами в глобальный хеш и, таким образом, для измерения «времени ответа». Кажется, что в классах HTTP * нет интерфейса, который бы давал вам время выполнения.


Редактировать:
Есть два способа связать HTTPResponse с HTTPRequest. Здесь я пытаюсь использовать второй метод с некоторым быстрым / грязным кодом. Пожалуйста, конвертируйте / используйте его так, как считаете нужным.

  1. SetTag / GetTag
  2. setUserData / getUserData

Создайте файл HTTPCustomData.h:

#include <time.h>
class HTTPCustomData {
private:
time_t t1;
public:
HTTPCustomData() { time(&t1); }
double getTimePassed(void) {
time_t t2; time(&t2); return(difftime(t2,t1));
}
};

Используйте следующий код для отправки запроса:

#include "HTTPCustomData.h"for ( int i = 0; i < servers.size(); ++i ) {
// ...
// ... Before "send"request->setUserData(new HTTPCustomData());
cocos2d::network::HttpClient::getInstance()->send(request);
request->release();
}

Позже в методе GameScene :: onServerRequestCompleted …

#include <memory>
#include <iostream>
#include "HTTPCustomData.h"void GameScene::onServerRequestCompleted(...) {
{
// ...
std::unique_ptr<HTTPCustomData> h(
(HTTPCustomData *)(response->getHTTPRequst()->getUserData())
);
std::cout << h->getTimePassed() << std::endl;
// ....
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]