zoukankan      html  css  js  c++  java
  • Cocos2d-X网络编程(2) Cocos2d中的网络通信协议——http协议

    HTTP协议也叫超文本传输协议。是互联网广泛使用的通信协议,常用于B/S架构中。
    HTTP连接使用的是短连接形式,也就是“请求-响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
     
    HTTP常用的有2种数据提交方式,分别是GET、POST
     1:get是从服务器上获取(查询)数据,post是向服务器传送数据;
     2:get传送的数据量较小,不能大于2KB,post传送的数据量较大,一般认为不受限;
     3:get安全性非常低;post安全性相对来说就比较好了;
     
    Cocos2d-x封装了3个类来处理HTTP请求,HttpRequest、HttpClient和HttpResponse。它们在命名空间cocos2d::network中定义,所以使用时要先声明该命名空间。

    请求过程:
    1. 创建 HttpRequest 的实例;
    2. 设置请求方式,GET、POST等。
    3. 设置请求地址和发送的数据;
    4. 设置响应回调函数,在回调函数中处理获取的数据;
    5. 创建HttpClient实例,发送请求;
    6. 释放连接。


    一:HttpRequest

    是一种数据类型,它提供了一些方法用来定义或获取HTTP请求的参数。常用方法包括下面几种。
    设置请求连接:void setUrl(const char * url);
    设置请求类型:void setRequestType(Type type)
        Type是Cocos2d-x定义的一个枚举类型,包括5种类型。
        enum class Type
        {
              GET,
              POST,
              PUT,
              DELETE,
              UNKNOWN,
        };
    设置回调函数:void setResponseCallback(Ref * pTarget,SEL_HttpResponse pSelector )
    设置请求的数据,参数buffer是提交的数据,len是请求数据的长度:void setRequestData(const char* buffer, unsigned int len);

    二:HttpClient

      用来控制请求相关的参数,比如发送请求,设置请求超时时间。它使用单例模型。这一模式的目的是使得类的一个对象成为系统中的唯一实例。cocos2d中多处用到这一模型。
    比如Director对象,创建Director::getInstance()。
    又比如,音频处理对象: SimpleAudioEngine::getInstance();
    常用方法:
       发送请求:send(HttpRequest* request)
       设置连接超时时间:setTimeoutForConnect(int value) 

    三:HttpResponse

    包含服务器返回的数据等信息。使用HttpResponse提供的方法可以获取这些数据。
    常用方法:
       获取请求返回的数据:std::vector<char>* getResponseData();
       获取返回状态:getResponceCode    返回值是一个整数,200表示请求成功,400表示服务器错误,404表示服务器上找不到相应的文件。
      issucced():用来判断是否返回成功

    在发送请求的时候可能一次不止发送一条请求,那么怎么区分呢?可以在发送请求时设置tag,在响应中接收tag,判断,然后执行后续操作。

    设置请求头:setHeaders

        Content-Type:内容类型。用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。如果未指定 ContentType,默认为TEXT/HTML。
        charset:编码格式
        设置格式: Content-Type: application/json; charset=utf-8

    sendImmediate和send的区别:使用send,按顺序发送请求,使用sendImmediate,立即发送


    代码实操:

    头文件:

    #ifndef __TestHttp_SCENE_H__
    #define __TestHttp_SCENE_H__
    
    #include "cocos2d.h"
    
    #include "networkHttpRequest.h"
    #include "networkHttpClient.h"
    #include "networkHttpResponse.h"
    
    USING_NS_CC;
    using namespace cocos2d::network;
    
    class TestHttp : public cocos2d::Layer
    {
    public:
        static cocos2d::Scene* createScene();
        virtual bool init();
        void menuCloseCallback(cocos2d::Ref* pSender);
    	CREATE_FUNC(TestHttp);
    
    	// 发送请求后收到响应的回调函数
    	void complete(HttpClient *client,HttpResponse *response);
    };
    
    #endif // __TestHttp_SCENE_H__
    

    源文件:

    #include "TestHttpScene.h"
    #include "curlincludewin32curlcurl.h"
    
    Scene* TestHttp::createScene()
    {
        auto scene = Scene::create();
        auto layer = TestHttp::create();
        scene->addChild(layer);
        return scene;
    }
    
    bool TestHttp::init()
    {
        if ( !Layer::init() )
        {
            return false;
        }
        
    	// GET方式
    	// 一 1:创建 HttpRequest 的实例
    	auto getReq = new HttpRequest();
    	// 一 2:设置请求地址
    	getReq->setUrl("http://httpbin.org/ip");
    	getReq->setTag("type get");
    	// 一 3:设置请求类型 get
    	getReq->setRequestType(HttpRequest::Type::GET);
    	// 一 4:设置请求的数据
    	char data[50] = "data";
    	getReq->setRequestData(data,strlen(data));
    	// 一 5:设置服务器响应回调函数
    	getReq->setResponseCallback(CC_CALLBACK_2(TestHttp::complete,this));
    	
    	// 二 1:创建HttpClinet对象
    	auto client = HttpClient::getInstance();
    	// 二 2:设置超时时间
    	client->setTimeoutForConnect(60);
    	// 二 2:设置读取时间(可设可不设)
    	client->setTimeoutForRead(100);
    	// 二 3:发送请求
    	client->send(getReq);
    	// 二 4:释放请求
    	getReq->release();
    
    	// POST方式
    	auto postReq = new HttpRequest();
    	// 设置标记,用于区分不同请求
    	postReq->setTag("type post");
    	postReq->setUrl("http://httpbin.org/post");
    	postReq->setRequestType(HttpRequest::Type::POST);
    	// 设置请求头(内容类型和编码方式)
    	std::vector<std::string> header;
    	header.push_back("Content-Type:application/json;charset=utf-8");
    	postReq->setHeaders(header);
    	const char* reqData = "controller=cocos2d&action=testHttpPost";
    	postReq->setRequestData(reqData,strlen(reqData));
    	postReq->setResponseCallback(CC_CALLBACK_2(TestHttp::complete,this));
    
    	auto client2 = HttpClient::getInstance();
    	client2->sendImmediate(postReq);
    	postReq->release();
    
        return true;
    }
    
    // 服务器响应回调函数
    void TestHttp::complete(HttpClient *client,HttpResponse *response)
    {
    	// 获取请求的tag
    	log("request tag is:%s",response->getHttpRequest()->getTag());
    	// 获取响应状态
    	log("response code is:%d",response->getResponseCode());
    	if(response->isSucceed())    // 返回成功
    	{
    		/*std::vector<char> * data = response->getResponseData();
    		log("response data is:");
    		for (int i = 0; i < data->size(); i++)
    		{
    			log("%c",(*data)[i]);
    		}*/
    		std::vector<char> * data = response->getResponseData();
    		std::stringstream oss;
    		for (int i = 0; i < data->size(); i++)
    		{
    			oss<<(*data)[i];
    		}
    		std::string str = oss.str();
    		log("response data is:%s",str.c_str());
    	}else   //  失败,打印错误信息
    	{
    		log("error msg is:%s",response->getErrorBuffer());
    	}
    }
    

     
     

  • 相关阅读:
    UOJ 【UR #5】怎样跑得更快
    【TJOJIHEOI2016】求和
    CF 932E Team Work
    【BZOJ2159】Crash的文明世界
    Luogu P4707 重返现世
    Luogu P3175 [HAOI2015]按位或
    【BZOJ3930】选数
    nginx 学习
    如何解决 react-create-app 里面的 no-unused-vars ?
    随时更新web html 项目页面,查看手机等其他移动设备的几种方法?
  • 原文地址:https://www.cnblogs.com/lmx282110xxx/p/10798717.html
Copyright © 2011-2022 走看看