16.cocos2d-x网络编程二(WebSocket)

TestWebSocketScene.h文件:


#ifndef __TestWebSocketScene_SCENE_H__
#define __TestWebSocketScene_SCENE_H__
#include "cocos2d.h"
#include "network\WebSocket.h"
USING_NS_CC;
using namespace cocos2d::network;

//继承WebSocket::Delegate,实现四个虚拟方法
class TestWebSocket : public cocos2d::Layer,WebSocket::Delegate
{
    public:
        // there's no 'id' in cpp, so we recommend returning the class instance pointer
        static cocos2d::Scene* createScene();
        // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
        virtual bool init();

        //连接时调用
        virtual void onOpen(WebSocket *ws);
        //接收数据时调用
        virtual void onMessage(WebSocket *ws,const WebSocket::Data &data);
        //关闭连接时调用
        virtual void onClose(WebSocket *ws);
        //发送数据但没有建立连接,或是受到断开连接的信号时调用。
        virtual void onError(WebSocket *ws,const WebSocket::ErrorCode& error);

        // implement the "static create()" method manually
        CREATE_FUNC(TestWebSocket);
    private:
        WebSocket *wsText;
};

#endif // __TestWebSocketScene_SCENE_H__




TestWebSocketScene.cpp文件:


#include "TestWebSocketScene.h"


Scene* TestWebSocket::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::create();

    // 'layer' is an autorelease object
    auto layer = TestWebSocket::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool TestWebSocket::init()
{
    //
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }

    Size size = Director::getInstance()->getWinSize();
    wsText = nullptr;//初始化为空指针

    auto menu = Menu::create();
    menu->setPosition(Vec2::ZERO);
    addChild(menu);


    //1.初始化websocket
    auto lblSendText = Label::create("init websocket text","Arial",22);
    auto menuSendText = MenuItemLabel::create(lblSendText,[=](Ref *sender){
        wsText = new WebSocket();
        //初始化请求地址
        if( !wsText->init(*this,"ws://echo.websocket.org")){
            CC_SAFE_DELETE(wsText);//初始化失败:delete掉该对象,置空。
        };
    });
    menuSendText->setPosition(size/2);
    menu->addChild(menuSendText);


    //2.发送text数据
    auto lblSend = Label::create("sent text","Arial",22);
    auto menuSend = MenuItemLabel::create(lblSend,[=](Ref *sender){
        if (wsText!=nullptr)
        {
            wsText->send("hello websocket.");
        }
    });
    menuSend->setPosition(size.width/2,size.height/2-50);
    menu->addChild(menuSend);


    //3.发送Binary数据
    auto lblSendBinary = Label::create("sent Binary","Arial",22);
    auto menuSendBinary = MenuItemLabel::create(lblSendBinary,[=](Ref *sender){
        if (wsText!=nullptr)
        {
            char buffer[] = "hello \0 binary";
            wsText->send((unsigned char *)buffer,sizeof(buffer));//需要的是 unsigned char*要强制类型转换
        }
    });
    menuSendBinary->setPosition(size.width/2,size.height/2-100);
    menu->addChild(menuSendBinary);




    return true;
}

void TestWebSocket::onOpen(WebSocket *ws){
    log("webSocket (%p) open",ws);
    if (ws==wsText)
    {
        log("WebSocket send Text open");
    }

}

void TestWebSocket::onMessage(WebSocket *ws,const WebSocket::Data &data){
    log("webSocket (%p) receive message",ws);
    if (!data.isBinary)
    {//文本数据
        log("received message is :%s",data.bytes);
    }else//二进制数据的处理
    {
        std::string result;
        for (int i = 0; i < data.len; i++)
        {
            if (data.bytes[i]!='\0')//不等于0
            {
                result +=data.bytes[i];
            }else
            {
                result += "\'\\0\'";//转义字符  \' --> '   \\ --> \     结果'\0'
            }
        }
        log("received binary data is: %s",result.c_str());
    }
}

void TestWebSocket::onClose(WebSocket *ws){
    log("webSocket (%p) close",ws);
    if (ws==wsText)
    {
        log("WebSocket send Text close");
    }
}

void TestWebSocket::onError(WebSocket *ws,const WebSocket::ErrorCode &error){
    log("WebSocket (%p) error",ws);
    if (ws==wsText)
    {
        log("WebSocket send Text error");
    }
}


知识点:
返回的数据使用WebSocket::Data封装,它是cocos2d定义的一个结构体
struct Data
{
Data():bytes(nullptr), len(0), issued(0), isBinary(false){}
char* bytes; //存放的数据
ssize_t len, issued;//数据的长度
bool isBinary; //标识文本时文本数据还是二进制数据
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值