网络请求HttpClient,Socket,WebSocket

来源:互联网 发布:python 爬虫 视频教程 编辑:程序博客网 时间:2024/06/06 17:30

转载请说明出处:http://blog.csdn.net/lsmfeixiang/ 
github地址:https://github.com/teffy/cocos2dx

注意事项 Http HttpClient HttpRequest HttpResponse 使用步骤 代码实例 Socket SocketIO SIOClient SIODelegate WebSocket 使用步骤 源码下载

开发中肯定会用到网络这块,所以有必要学习一下http,socket,看官方demo里还有websocket,也顺便学习一下。

注意事项

如果使用VisualStudio的话,3.x使用Http会出现无法打开包含文件extensions/ExtensionExport.h 的错误,解决方案: 
1、在你自己的头文件中加入#include ”cocos-ext.h” 
2、使用命名空间USING_NS_CC_EXT; 
3、选中工程右键“属性”->”配置属性“->”c/c++”->”常规”->”附加包含目录”中添加“”$(EngineRoot) 
如图: 
查看图片

Http

cocos2dx中封装了对http的使用,主要的类有HttpClient,HttpRequest,HttpResponse。

HttpClient

处理异步http请求的单例模式 一旦请求完成,一个在生成请求时被提供的回调函数,会被发到主线程中;

HttpRequest

定义了用户必须为 HttpClient::send(HttpRequest*) 方法打包的对象,因为 HttpRequset 对象会被用在UI线程和network线程之间, 为了避免崩溃,在AutoreleasePool中,requestObj->autorelease()是被禁止的 new/retain/release 依然工作,意味着你需要手动释放它

HttpResponse

定义了用户会在onHttpCompleted(sender, HttpResponse) 回调中接收的对象,被HttpClient内部使用,用户不需要手动创建HttpResponse,不需要手动销毁HttpResponse对象

使用步骤

1、创建HttpRequest对象 
2、设置Url,RequestType,Tag,ResponseCallBack 
3、使用HttpClient将Request加入请求队列 
4、释放HttpRequest对象 
5、在CallBack中对Response进行处理数据

代码实例
HttpRequest *request = new HttpRequest();//step1request->setUrl("http://httpbin.org/ip");//地址是从官方demo中来的//step2request->setRequestType(HttpRequest::Type::GET);//step2request->setResponseCallback(        CC_CALLBACK_2(HelloWorld::onHttpCompletedCallback, this));//step2request->setTag("GET IP");//step2HttpClient::getInstance()->send(request);//step3request->release();//step4

回调函数// step5

void HelloWorld::onHttpCompletedCallback(HttpClient *httpClient, HttpResponse *response){    if (!response){        return;    }    if (0 != strlen(response->getHttpRequest()->getTag())){        log("n%s complete", response->getHttpRequest()->getTag());    }    long responseCode = response->getResponseCode();    log("response code %ld",responseCode);    if (!response->isSucceed()){        log("response faild");        log("error msg:%s", response->getErrorBuffer());        return;    }    std::vector<char>* data = response->getResponseData();    //std::string str = "";    /*for (std::vector<char>::iterator iterator = data->begin(); iterator != data->end(); ++iterator){        str += *iterator;    }*/    /*for (unsigned int i = 0; i < data->size(); i++){        str += (*data)[i];    }*/    std::string str(data->begin(),data->end());    log("data:n%s", str.c_str());    label->setString(str);}

http的基本就这些了。

Socket

通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄,socket是对TCP/IP协议的封装和应用,cocos2dx中封装了对socket的使用,主要使用的类有 
SocketIO、SIOClient、SocketIO::SIODelegate(当然实际项目中可能会用到不是官方的库)

SocketIO

单例和包装的类,提供了静态创建方法以及所有sockets的注册

SIOClient

到socket.io端点的单个连接

SIODelegate

处理socket.io事件的delegate类 ,回调处理的类,内部有4个方法需要处理

virtual void onConnect(SIOClient* client);virtual void onMessage(SIOClient* client, const std::string& data);virtual void onClose(SIOClient* client);virtual void onError(SIOClient* client, const std::string& data);

对这块不熟悉,看官方demo中的code,然后自己用java写了一个socket的server,但是死活连不上,不知道为什么,回头研究明白了再放具体code。

WebSocket

WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。cocos2dx中封装了对于websocket的使用,相关的类有WebSocket、WebSocket::Delegate、WebSocket::Data、WebSocket::State。 
WebSocket封装了所以的基本操作 
WebSocket::Delegate是对于websocket各种操作的回调,有4个回调函数

virtual void onOpen(WebSocket* ws);virtual void onMessage(WebSocket* ws, const WebSocket::Data& data);virtual void onClose(WebSocket* ws);virtual void onError(WebSocket* ws, const WebSocket::ErrorCode& error);

WebSocket::Data是websocket数据相关 
WebSocket::State表示websocket的连接状态

使用步骤

1、初始化WebSocket对象

_webSocket = new WebSocket();if (!_webSocket->init(*this, "ws://echo.websocket.org")){//init函数需要两个参数,第一个是Delegate对象,第二个是url    CC_SAFE_DELETE(_webSocket);}

2、发送数据

if (!_webSocket){    return;}if (_webSocket->getReadyState() == WebSocket::State::OPEN){    label->setString("sending message...");    _webSocket->send("Hello WebSocket,I am cocox2dx");}else{    label->setString("WebSocket is not ready...");}

3、在回调函数中处理回调操作和数据

void HelloWorld::onOpen(WebSocket* ws){    if(ws == _webSocket){        label->setString("WebSocket opened");    }}void HelloWorld::onMessage(WebSocket* ws, const WebSocket::Data& data){    std::string printmsg = std::string("response msg:")+data.bytes;    label->setString(printmsg.c_str());}void HelloWorld::onClose(WebSocket* ws){    if(ws == _webSocket){        _webSocket = nullptr;    }    CC_SAFE_DELETE(ws);}void HelloWorld::onError(WebSocket* ws, const WebSocket::ErrorCode& error){    if(ws == _webSocket){        char buf[100] ={0};        sprintf(buf,"WebSocket error,code:%d",error);        label->setString(buf);    }}

差不多就这些了,socket还没搞明白,大家可以去源码中查看用法。

源码下载

Cocos2dx技术(三)——cocos2dx基本概念(六)控件库
cocos2dx提供了一套易于使用的控件库来满足开发者的GUI需求。cocos2dx控件大致可分为两种,第一种是非继承自Widget类的早期控件库;第二类是新的继承自W

续上篇cocos2dx函数重载异常的问题
之前遇到了这样的问题:我的函数只有一种声明,而VS2010却给出好多个重载,细看,都是以前这个函数的版本,具体参考前一篇博客http://blog.csdn.net/bark2

cocos2dx2.x批量移除CCNode的方法
项目需求如下:生成若干Sprite来播放动画,播放完之后将Sprite移除原打算将所有Sprite都设为相同的Tag,然后在播放完之后removeChildByTag了事但未能如愿,

原创粉丝点击