Cocos2d-x示例提供了三种内置的网咯通信类
HttpClient,WebSocket,SocketIO。
其中第一个是简单的HTTP协议的使用,提供很多Http请求方式。
剩下的Socket*是针对类Socket连接的方式,不提供应用协议封装,所以测试的时候大部分都是Error出现,但是应该比较适合C/S模式的网络手游开发。
HttpClient使用方式简单:
WebSocket和SocketIO都要实现相应的委托基类中的纯虚函数(类似Java的抽象类的子类实现)
测试过程中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。
以上。