cocos2d-x网络编程三(SocketIO)

前端之家收集整理的这篇文章主要介绍了cocos2d-x网络编程三(SocketIO)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

记得提前设置 好服务器环境

TestSocketIoScene.h文件

#ifndef __TestSocketIo_SCENE_H__
#define __TestSocketIo_SCENE_H__
#include "cocos2d.h"
#include "network\SocketIO.h"
USING_NS_CC;
using namespace cocos2d::network;

//继承SocketIO::SIODelegate和实现四个虚函数
class TestSocketIo : public cocos2d::Layer,SocketIO::SIODelegate
{
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();

    //socket连接时调用
    void onConnect(SIOClient* client);
    //收到数据时调用
    void onMessage(SIOClient* client,const std::string& data);
    //连接错误或接收到错误信号时调用
    void onError(SIOClient* client,const std::string& data);
    //socket关闭调用
    void onClose(SIOClient* client);

    // implement the "static create()" method manually
    CREATE_FUNC(TestSocketIo);

    SIOClient *client;

};

#endif // __TestSocketIo_SCENE_H__

TestSocketIoScene.cpp文件

#include "TestSocketIoScene.h"


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

    // 'layer' is an autorelease object
    auto layer = TestSocketIo::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 TestSocketIo::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    Size size = Director::getInstance()->getWinSize();
    client = nullptr;//初始化为空指针

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



    auto lblInit = Label::create("init socket","Arial",22);
    auto menuInit = MenuItemLabel::create(lblInit,[=](Ref *sender){
        //1.connect方法创建实例
        client = SocketIO::connect("ws://192.168.1.102:3000",*this);
        client->setTag("init socket");
        //4.初始化的时候设置一个监听器:使用on监听事件和获取接收到的数据
        client->on("loginresult",[=](SIOClient *client,const std::string &data){//使用C++匿名函数实现
            log("login result is :%s",data.c_str());
        });
    });
    menuInit->setPosition(size/2);
    menu->addChild(menuInit);




    auto lblSend = Label::create("send message",22);
    auto menuSend = MenuItemLabel::create(lblSend,[=](Ref *sender){
        //2.send方法发送数据
        client->send("hello socket.io");
    });
    menuSend->setPosition(size.width/2,size.height/2-50);
    menu->addChild(menuSend);



    auto lblSendEvent = Label::create("emit event",22);
    auto menuSendEvent = MenuItemLabel::create(lblSendEvent,[=](Ref *sender){
        //3.向服务器发送login事件,并把名字和密码传给服务器 
        client->emit("login","[{\"name\":\"myname\",\"pwd\":\"mypwd\"}]");
    });
    menuSendEvent->setPosition(size.width/2,size.height/2-100);
    menu->addChild(menuSendEvent);




    return true;
}

void TestSocketIo::onConnect(SIOClient* client){
    log("onConnect");
    log("%s connect",client->getTag());
}

void TestSocketIo::onMessage(SIOClient* client,const std::string& data){
    log("onMessage");
    log("%s received content is:%s",client->getTag(),data.c_str());
}

void TestSocketIo::onClose(SIOClient * client){
    log("onClose");
    log("%s is closed",client->getTag());
}
void TestSocketIo::onError(SIOClient* client,const std::string& data){
    log("onError");
    log("%s error is:%s",data.c_str());
}

猜你在找的Cocos2d-x相关文章