【问题标题】:Get execution time of http request获取http请求的执行时间
【发布时间】:2016-08-17 20:18:41
【问题描述】:

我有以下代码:

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";
}

}

我正在尝试获取正确的服务器。我想要做的是获取每个服务器请求的执行时间并获得最快的。可能吗?因为它是一个异步函数,我不知道该怎么做。你会怎么做?

【问题讨论】:

    标签: c++ cocos2d-x-3.x


    【解决方案1】:

    这有帮助吗?从文档 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;
        // ....
    }
    

    【讨论】:

    • 是的,这很有帮助,但我不会将其标记为答案,因为我无法获得执行时间,但非常感谢,感谢您的帮助。
    • @duri,一旦我能够将请求与响应相匹配,我就可以通过将 requests/timeValue 放入全局哈希中来测量“响应时间”。我承认如果我们有 HTTPResponse::getResponseTime() 会容易得多,但我没有看到这样的接口。
    • 这就是我需要的。我是 C++ 新手,我不知道如何存储键值对。现在我正在尝试用 Json::Value 来做,但我不知道它是否有效。你能提供一个如何创建这个全局哈希的例子吗?
    • @duri,你的 c++ 版本是什么(C++03、C++11、C++14)?您的操作系统是什么(unix/linux、Windows)?
    • 我想做这个跨平台,但我有 Ubuntu 14.04 并且我使用的是 C++11。我刚刚发现要获得最快的服务器,我只需写下第一个响应的 IP 地址(它是最快的,因为它的响应在前)。
    猜你喜欢
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多