《Cocos2d学习之路》十、网络请求HttpClient,Socket,WebSocket

转载请说明出处: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)
如图:
《Cocos2d学习之路》十、网络请求HttpClient,Socket,WebSocket_第1张图片

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();//step1
request->setUrl("http://httpbin.org/ip");//地址是从官方demo中来的//step2
request->setRequestType(HttpRequest::Type::GET);//step2
request->setResponseCallback(
        CC_CALLBACK_2(HelloWorld::onHttpCompletedCallback, this));//step2
request->setTag("GET IP");//step2
HttpClient::getInstance()->send(request);//step3
request->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::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开发)