前言
网络编程是开发中必不可少的一环, Cocos2d-x
提供了一个简单易用的网络模块,包括 HTTP
、 WebSocket
和 Socket
三种协议的支持。
它们都是基于标准的网络协议和 API 实现的,因此可以很容易地与其他网络库或服务端进行通信。
今天就来学习一下 HTTP
的使用。
HttpClient
在 Cocos2d-x
中,我们可以使用 network::HttpClient
类进行 HTTP
请求。它提供了以下方法:
1
2
3
4
5
6
|
static HttpClient* getInstance();
void send(HttpRequest* request);
void sendImmediate(HttpRequest* request);
void setTimeoutForConnect(int timeout);
void setTimeoutForRead(int timeout);
void setSSLVerification(const char* caFile);
|
getInstance()
方法用于获取 HttpClient
的单例对象
send()
方法用于发送 HTTP
请求,需要传入一个 HttpRequest
对象
sendImmediate()
方法与 send()
方法类似,但会立即发送请求,而不是添加到队列中等待发送
setTimeoutForConnect()
和 setTimeoutForRead()
方法分别用于设置连接和读取的超时时间
setSSLVerification()
方法用于设置 SSL
证书验证
HttpRequest
类定义了 HTTP
请求的参数和回调函数:
1
2
3
4
5
6
7
8
9
|
class HttpRequest : public cocos2d::Ref
{
public:
void setRequestType(RequestType type);
void setUrl(const char* url);
void setRequestData(const char* data, size_t len);
void setResponseCallback(const ccHttpRequestCallback& callback);
void setTag(const char* tag);
};
|
setRequestType()
方法用于设置 HTTP 请求的类型,包括 GET、POST、PUT、DELETE 等
setUrl()
方法用于设置请求的 URL
setRequestData()
方法用于设置请求的数据,例如 POST
请求中的表单数据
setResponseCallback()
方法用于设置请求完成后的回调函数
setTag()
方法用于设置请求的标签
在请求完成后,我们可以在回调函数中获取到服务器返回的数据,例如:
1
2
3
4
5
6
7
8
|
void onHttpRequestCompleted(HttpClient* client, HttpResponse* response) {
if (!response) {
return;
}
std::vector<char> buffer = response->getResponseData();
std::string str(buffer.begin(), buffer.end());
log("Response: %s", str.c_str());
}
|
接下来看两个例子,一个 GET
请求,另一个 POST
请求。
GET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include "network/HttpClient.h"
USING_NS_CC;
void HelloWord::request() {
auto req = new cocos2d::network::HttpRequest(); // 创建http请求
req->setUrl("127.0.0.1:8080/get"); // 设置url
req->setRequestType(cocos2d::network::HttpRequest::Type::GET); // 设置为 GET 请求
req->setResponseCallback(CC_CALLBACK_2(HelloWorld::requestComplete, this)); // 设置回调
cocos2d::network::HttpClient::getInstance()->sendImmediate(req); // 发送请求
req->release();
}
void HelloWorld::requestComplete(cocos2d::network::HttpClient *sender, cocos2d::network::HttpResponse *response) {
if (response && response->isSucceed()) {
log("%s\n", response->getResponseData()->data()); // 请求成功打印服务端返回数据
}
}
|
服务端会返回 Hello Cocos
,执行之后就可以看到控制台输出的 Hello Cocos
。
服务端代码在文末。
POST
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include "network/HttpClient.h"
USING_NS_CC;
void HelloWord::request() {
auto req = new cocos2d::network::HttpRequest();
req->setUrl("127.0.0.1:8080/post");
req->setRequestType(cocos2d::network::HttpRequest::Type::POST); // 设置为 POST请求
req->setRequestData("username=cocos", 14); // 设置请求的数据和长度
req->setResponseCallback(CC_CALLBACK_2(HelloWorld::requestComplete, this));
cocos2d::network::HttpClient::getInstance()->sendImmediate(req);
req->release();
}
void HelloWorld::requestComplete(cocos2d::network::HttpClient *sender,
cocos2d::network::HttpResponse *response) {
if (response && response->isSucceed()) {
log("%s\n", response->getResponseData()->data());
}
}
|
服务端会返回用户名,也就是 cocos
,控制台也会输出。
服务端代码
服务端采用 golang
开发,简单的实现了 get/post
路由。
1
2
3
4
5
6
7
8
9
10
11
|
func main() {
http.HandleFunc("/get", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello Cocos"))
})
http.HandleFunc("/post", func(w http.ResponseWriter,r *http.Request){
r.ParseForm()
user := r.Form.Get("username")
w.Write([]byte(user))
})
http.ListenAndServe(":8080", nil)
}
|
把这些代码放到 main.go
中,通过 go run main.go
运行。
总结
Cocos2d
为我们封装了一套简单的网络请求,使得我们可以快速的进行网络开发。
在实际应用中,网络通信往往涉及到复杂的业务逻辑和数据处理,我们需要根据具体情况进行合理的封装和抽象,以便代码的重用和维护。
希望这篇文章能够帮助读者了解 Cocos2d-x
中的网络通信和加载动画的实现方式,并在实际开发中提供一些参考和思路。
参考