欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

cocos2dx的网络链接方式

程序员文章站 2024-03-16 17:02:34
...

                                    cocos2dx的网络链接方式

 

cocos使用httpClient发送请求

游戏开发的过程中难免需要和服务端进行数据交互,我们可以利用cocos给我们封装好的httpClient类来通过http协议进行数据的交互。

httpClient是一个单例的类,我们可以通过HttpClient:getInstrance()来获取这个单例。

数据的交互分为请求request和返回response两个部分,作为客户端来说我们首先要把玩家操作的数据上传给服务端,然后再根据服务端发回来的结果进行一系列操作。

(1)request请求

 coco2dx中我们可以直接new HttpRequest()来创造一个http请求,在quick中我们可以createHTTPRequest来实例一个request类。

request类继承与Ref,同样受到cocos内存管理机制的管理

作为请求我们需要几个比较重要的信息:要连接的URL,回协议时的回调,与http交互的方式,自身的tag标签等等

 我们可以看看request类中的源码是怎么样对这些参数进行设置的

    inline void setRequestType(Type type)
    {
        _requestType = type;
    };

    inline void setUrl(const char* url)
    {
        _url = url;
    };

    inline void setTag(const char* tag)
    {
        _tag = tag;
    };

    inline void setUrl(const char* url)
    {
        _url = url;
    };

    inline void setResponseCallback(const ccHttpRequestCallback& callback)
    {
        _pCallback = callback;
    }

注意,我们常用的TYPEGETPOST,其中GET是把请求的数据跟在网址后面以 ? 分割 URL 和传输数据,多个参数用 & 连接,而POST则url只填网址,把请求的指令放在setRequestData()中 

对于GET和POST的具体区别可以看看这个文章:

GET和POST的区别可以看看这个文章

当设置完成后我们就可以让httpClient类来发送这个请求。与服务端链接成功之后,交互的信息会封装在response类中随着回调函数返回来。

 

 (2)response回复

  这个类十分简单,我们首先来看一看这个类中究竟有什么元素:

    HttpRequest*        _pHttpRequest;  /// the corresponding HttpRequest pointer who leads to this response 
    bool                _succeed;       /// to indecate if the http reqeust is successful simply
    std::vector<char>   _responseData;  /// the returned raw data. You can also dump it as a string
    std::vector<char>   _responseHeader;  /// the returned raw header data. You can also dump it as a string
    long                _responseCode;    /// the status code returned from libcurl, e.g. 200, 404
    std::string         _errorBuffer;   /// if _responseCode != 200, please read _errorBuffer to find the reason 

  其实就是请求的指针,是否成功,返回的数据,返回码(链接失败发404),和报错的数据而已

  所有我们只需要在回调函数中,对是否请求成功做出判断,就可以输出错误日志或者执行之后的操作了。

 下面给大家看一个例子:

auto request = new HttpRequest();
request->setUrl("http://www.baidu.com");    // 设置请求连接的Url
request->setReqeustType(HttpRequest::Type::GET);    // 设置发送数据的模式:get/post/put/delete
request->setReqeustCallback(CC_CALLBACK_2(requestCallback, this));    // 设置连接成功时候的回调
HttpClient:getInstrance()->send(request);    // 发送这个请求

void requestCallback(HttpClient *sender, HttpResponse *response)
{
    if (response->isSucceed())
    {
        cout << "error msg:" << response->getErrorBuffer() << endl;
        return;
    } 
    
    vector<char> *buffer = response->getResponseData();    // 请求服务端得到的数据
    long statusCode = response->getResponseCode();    // 返回码
    
    /*
        do callBack
    */
}

至此就完成一个利用http协议和服务端交互数据的流程。

 

cocos使用webSocket发送请求

WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

Cocos2d-x引擎集成libwebsockets,并在libwebsockets的客户端API基础上封装了一层易用的接口,使得引擎在C++, JS, Lua层都能方便的使用WebSocket来进行游戏网络通讯。

构建一个webSocket的过程如下:

  • 创建并初始化一个webSocket
  •  与服务端进行连接
  • 监听服务端的发送的数据&向服务端发送数据
  • 关闭socket连接

(1) 创建并初始化一个webSocket

cocos2d::network::WebSocket* _wsiSendText = new network::WebSocket(); 

(2) 与服务端进行连接

 第一个参数是委托,传递自身的*this,第二个参数是要连接的URL

_wsiSendText->init(*this, "ws://echo.websocket.org") 

如果连接成功,WebSocket就会调用onOpen,告诉调用者,客户端到服务器的通讯链路已经成功建立,可以收发消息了。此时自身对的state会处在CONNECTING状态。

如果连接失败,会触发onError函数,并返回一个errorCode, errorCode的类型有三种:

    enum class ErrorCode
    {
        TIME_OUT,           /** &lt; value 0 */
        CONNECTION_FAILURE, /** &lt; value 1 */
        UNKNOWN,            /** &lt; value 2 */
    };

 此时我们可以选择重连或者断开连接报错。

(3)监听服务端的发送的数据&向服务端发送数据

network::WebSocket::Data对象存储客户端接收到的数据, isBinary属性用来判断数据是二进制还是文本,len说明数据长度,bytes指向数据

客户端依靠onMessage来监听服务端发送的数据:

void WebSocketTestLayer::onMessage(network::WebSocket* ws, const network::WebSocket::Data& data) {
     if (!data.isBinary){ 
        _sendTextTimes++;
        char times[100] = {0};
        sprintf(times, "%d", _sendTextTimes);
        std::string textStr = std::string("response text msg: ")+data.bytes+", "+times;         
        log("%s", textStr.c_str());
        _sendTextStatus->setString(textStr.c_str());
} } 

客户端通过send向服务端发送数据: send有文本和二进制两种模式

_wsiSendText->send("Hello WebSocket, I'm a text message."); 
_wsiSendBinary->send((unsigned char*)buf, sizeof(buf)); 

(4)主动关闭WebSocket

这是让整个流程变得完整的关键步骤, 当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接(因为并不受内存管理机制管理)。close会触发onClose消息,而后onClose里面,我们释放内存

wsSendText:close() 

 至此就完成一个利用WebSocket协议和服务端交互数据的流程。