Cocos2d-x网络通信

时间:2023-03-09 02:20:20
Cocos2d-x网络通信

Cocos2d-x示例提供了三种内置的网咯通信类

HttpClient,WebSocket,SocketIO。

其中第一个是简单的HTTP协议的使用,提供很多Http请求方式。

剩下的Socket*是针对类Socket连接的方式,不提供应用协议封装,所以测试的时候大部分都是Error出现,但是应该比较适合C/S模式的网络手游开发。

HttpClient使用方式简单:

Cocos2d-x网络通信

WebSocket和SocketIO都要实现相应的委托基类中的纯虚函数(类似Java的抽象类的子类实现)

Cocos2d-x网络通信

测试过程中WebSocket总是卡住UI,所以可能有问题。

头文件:

 #ifndef __NETWORK_SCENE_H__
 #define __NETWORK_SCENE_H__

 #include "cocos2d.h"
 #include "network/HttpClient.h"
 #include "network/HttpRequest.h"
 #include "network/HttpResponse.h"
 #include "network/SocketIO.h"
 #include "network/WebSocket.h"

 class NetworkScene : public cocos2d::Layer
     ,public cocos2d::network::SocketIO::SIODelegate
     , public cocos2d::network::WebSocket::Delegate
 {
 public:
     static cocos2d::Scene* createScene();
     virtual bool init();
     void onHttpRequestCompleted(cocos2d::network::HttpClient *sender, cocos2d::network::HttpResponse *response);
     CREATE_FUNC(NetworkScene);

     //SocketIO
     virtual void onConnect(cocos2d::network::SIOClient* client);
     virtual void onMessage(cocos2d::network::SIOClient* client, const std::string& data);
     virtual void onClose(cocos2d::network::SIOClient* client);
     virtual void onError(cocos2d::network::SIOClient* client, const std::string& data);
     void testevent(cocos2d::network::SIOClient *client, const std::string& data);

     //WebSocket,可能处理有误
     virtual void onOpen(cocos2d::network::WebSocket* ws);
     virtual void onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data);
     virtual void onClose(cocos2d::network::WebSocket* ws);
     virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error);

 private:
     cocos2d::network::SIOClient *client;
 };

 #endif //__NETWORK_SCENE_H__

实现cpp

 #include "NetworkScene.h"
 #include <vector>
 #include <string>

 #pragma warning(disable : 4996)

 USING_NS_CC;

 Scene* NetworkScene::createScene(){
     auto scene = Scene::create();
     auto layer = NetworkScene::create();
     scene->addChild(layer);
     return scene;
 }

 bool NetworkScene::init(){
     if (!Layer::init()){
         return false;
     }

     auto request = new (std::nothrow)network::HttpRequest();
     request->setUrl("http://www.httpbin.org/get");
     request->setRequestType(network::HttpRequest::Type::GET);
     request->setResponseCallback(CC_CALLBACK_2(NetworkScene::onHttpRequestCompleted,this));
     request->setTag("GET TEST1");
     network::HttpClient::getInstance()->send(request);
     request->release();

     request = new (std::nothrow)network::HttpRequest();
     request->setUrl("http://www.httpbin.org/post");
     request->setRequestType(network::HttpRequest::Type::POST);
     std::vector<std::string> headers;
     headers.push_back("Content-Type: application/json;charset=utf-8");
     request->setHeaders(headers);
     const char *posData = "vistor=cocos2d-x&TestSuite=Extensions Test/NetworkTest";
     request->setRequestData(posData, strlen(posData));
     request->setTag("POST TEST1");
     request->setResponseCallback(CC_CALLBACK_2(NetworkScene::onHttpRequestCompleted,this));
     network::HttpClient::getInstance()->send(request);
     request->release();

     client = network::SocketIO::connect(*this,"ws://channon.us:300");
     client->setTag("SOCKET TEST");
     client->on("testEvent", CC_CALLBACK_2(NetworkScene::testevent, this));
     //应该收不到消息,因此我关闭的太早了
     client->send("SIOCLIENT");
     client->disconnect();

 //     auto webSocket = new network::WebSocket();
 //     webSocket->init(*this, "ws://echo.websocket.org");
 //     if (webSocket->getReadyState() == network::WebSocket::State::OPEN){
 //         log("Waiting");
 //         webSocket->send("I SEND This Message");
 //     }
 //
 //     webSocket->close();

     return true;
 }

 void NetworkScene::onHttpRequestCompleted(cocos2d::network::HttpClient *sender, cocos2d::network::HttpResponse *response){
     log("OK");
      != strlen(response->getHttpRequest()->getTag())){
         log("%s completed ", response->getHttpRequest()->getTag());

         int responseCode = response->getResponseCode();
         log("%d", responseCode);

         if (response->isSucceed()){
             log("Successed");
         }

         std::vector<char> *buffer = response->getResponseData();
         std::string buf(buffer->begin(), buffer->end());
         log("%s", buf.c_str());
     }
 }

 void NetworkScene::testevent(cocos2d::network::SIOClient *client, const std::string& data){
     log("OK %s ",data.c_str());
 }

 void NetworkScene::onConnect(network::SIOClient* client)
 {
     log("SocketIOTest::onConnect called");
 }

 void NetworkScene::onMessage(network::SIOClient* client, const std::string& data)
 {
     log("SocketIOTest::onMessage received: %s", data.c_str());
 }

 void NetworkScene::onClose(network::SIOClient* client)
 {
     log("SocketIOTest::onClose called");
 }

 void NetworkScene::onError(network::SIOClient* client, const std::string& data)
 {
     log("SocketIOTest::onError received: %s", data.c_str());
 }

 void NetworkScene::onOpen(cocos2d::network::WebSocket* ws){
     log("open %p", ws);
 }
 void NetworkScene::onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data){
     log("message %p", ws);
 }
 void NetworkScene::onClose(cocos2d::network::WebSocket* ws){
     log("close %p", ws);
 }
 void NetworkScene::onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error){
     log("error %p", ws);
 }

测试结果就无法贴出来,特别是后面的两个Socket。

以上内容仅供参考,代码很有可能有重大BUG。

以上。