前言

网络编程是开发中必不可少的一环, Cocos2d-x 提供了一个简单易用的网络模块,包括 HTTPWebSocketSocket 三种协议的支持。

它们都是基于标准的网络协议和 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 中的网络通信和加载动画的实现方式,并在实际开发中提供一些参考和思路。

参考