cocos2dx的网络链接方式
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;
}
注意,我们常用的TYPE是GET和POST,其中GET是把请求的数据跟在网址后面以 ? 分割 URL 和传输数据,多个参数用 & 连接,而POST则url只填网址,把请求的指令放在setRequestData()中
对于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, /** < value 0 */
CONNECTION_FAILURE, /** < value 1 */
UNKNOWN, /** < 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协议和服务端交互数据的流程。
下一篇: 四叉树之碰撞检测(梁王的代码解剖室)