//同样Cocos2d-x游戏引擎对WebSocket进行了整合封装
//使用Websocket需要继承cocos2d::network::WebSocket::Delegate这个类,并重写4个纯虚函数
//加入头文件
#include "network/WebSocket.h"
//使用命名空间
USING_NS_CC;
using namespace cocos2d::network;
//.h文件
virtual void onOpen(cocos2d::network::WebSocket* ws);
virtual void onClose(cocos2d::network::WebSocket* ws);
virtual void onMessage(cocos2d::network::WebSocket* ws,const cocos2d::network::WebSocket::Data& data);
virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error);
cocos2d::network::WebSocket* _ws;
//.cpp文件
bool HelloWorld::init()
{
//
// 1. super init first
if (!Layer::init())
{
return false;
}
Size size = Director::getInstance()->getWinSize();
//创建对象
_ws=new WebSocket();
if (!_ws->init(*this,"ws://echo.websocket.org"))
{
CC_SAFE_DELETE(_ws);
}
auto lblSendText = Label::create("send","Arial",22);
auto menuSendText = MenuItemLabel::create(lblSendText,[=](Ref *sender){
if (_ws!=nullptr)
{
//文本发送
_ws->send("HelloWord");
//二进制发送
char value[16]="HelloWord";
_ws->send((const unsigned char*)value,(unsigned int)strlen(value));
}
});
menuSendText->setPosition(size/2);
auto menu = Menu::create();
menu->setPosition(Vec2::ZERO);
menu->addChild(menuSendText);
addChild(menu);
return true;
}
void HelloWorld::onOpen(cocos2d::network::WebSocket* ws)
{
if (ws==_ws)
{
log("open");
}
}
//Data是WebSocket内部的结构体
void HelloWorld::onMessage(cocos2d::network::WebSocket* ws,const cocos2d::network::WebSocket::Data& data)
{
if (ws==_ws)
{
if (data.isBinary)
{
//二进制
std::string str;
for (int i = 0; i < data.len; i++)
{
if (data.bytes[i]!=0)
{
str+=data.bytes[i];
}
else
{
str+="\'\\0\'";
}
}
log("%s",str.c_str());
}
else
{
//文本
log("%s",data.bytes);
}
}
}
void HelloWorld::onClose(cocos2d::network::WebSocket* ws)
{
if (ws==_ws)
{
log("close");
}
}
//ErrorCode是WebSocket枚举类型
void HelloWorld::onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error)
{
if (ws==_ws)
{
log("error");
}
}
//运行程序
//当WebSocket初始化连接成功时
//点击label
//此时log出二行,一行是文本,一行是二进制发送