《Cocos2d学习之路》十、网络请求HttpClient,Socket,WebSocket
来源:互联网 发布:三国志13 知乎 编辑:程序博客网 时间:2024/05/17 06:44
转载请说明出处: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还没搞明白,大家可以去源码中查看用法。
源码下载
- 《Cocos2d学习之路》十、网络请求HttpClient,Socket,WebSocket
- 网络请求HttpClient,Socket,WebSocket
- 网络请求HttpClient,Socket,WebSocket
- 网络请求之HttpClient
- cocos2d-x学习日记之网络通信篇—HttpClient
- Httpclient之网络请求数据
- HttpClient之网络请求数据
- Android 之 HttpClient 网络请求
- Cocos2d-x 之 WebSocket 网络编程
- 【cocos2dx学习笔记】HttpClient网络请求
- HttpClient java发送网络请求的学习
- 网络请求之HttpClient 类的使用
- android网络数据请求之HttpClient
- Android网络数据请求之HttpClient
- Android中的网络请求之HttpClient
- HttpClient发送网络请求
- HttpClient请求网络
- HttpClient网络请求
- Android 应用程序框架设计
- 手机充电自动关机内存卡的文件怎么恢复
- Cocosd-x设计模式 -- 防御式编程模式
- 分布式(集群)与集群的联系与区别
- ios 基本控件总结
- 《Cocos2d学习之路》十、网络请求HttpClient,Socket,WebSocket
- 页面到指定位置
- java同步机制对象锁使用方式比较
- HDU2724 Tree【最小生成树】
- 家庭财务管理系统实战7-终结,源码
- AspNet MVC4 教学-10:Asp.Net MVC4 @Html.Action及@Html.RenderAction 的测试
- 源代码安全与开发企业的绩效关系!
- Context上下文
- CentOS下DDoS攻击防御和分析