网络请求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)
如图:
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(当然实际项目中可能会用到不是官方的库)
单例和包装的类,提供了静态创建方法以及所有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。
WebSocketWebSocket 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了事但未能如愿,
- 网络请求HttpClient,Socket,WebSocket
- 网络请求HttpClient,Socket,WebSocket
- 《Cocos2d学习之路》十、网络请求HttpClient,Socket,WebSocket
- HttpClient发送网络请求
- HttpClient请求网络
- 网络请求之HttpClient
- HttpClient网络请求
- httpclient网络请求数据
- HttpClient请求网络数据
- HttpClient网络请求数据
- HttpClient网络请求
- HttpClient网络请求
- [cocos2dx]网络请求httpClient
- Httpclient 请求网络
- HttpClient网络请求
- Android_请求网络HttpClient
- HttpClient实现网络请求
- HttpURLConnection、HttpClient网络请求
- 栈的基本操作(附带一个数据结构、C语言版)
- K-D Tree详解
- 3295: [Cqoi2011]动态逆序对
- TCPIP 网络科普 (james-lx)
- Spring(05)——基于XML配置的自动注入(autowire)
- 网络请求HttpClient,Socket,WebSocket
- 1285: 最简单的循环
- HTML 基础标签
- 函数之内联函数
- 常见DOS操作命令
- GreenDao学习以及基本使用(老罗学习总结)
- CodeForces 25D Roads not only in Berland
- 王爽.汇编.第三版.检测点17.1.疑似答案
- 孤单数