• TCPSocket v1.0 for cocos2d-x下载


    下载地址:http://files.cnblogs.com/elephant-x/TCPSocketLibs_V1.0.rar

    这是自己封装的一个TCPSOCKET包,是独立于cocos2d-x的,使用的时候,请把该项目加入到cocos2d-x里面去,再在项目里面包含libSocket项目和libSocket.lib

    1、独立线程接收,异步连接服务端,防止界面卡的情况。

    2、支持WIN32和LINUX。

    3、编译linux时,在项目的Android.mk文件里必须添加下面两行:

      LOCAL_WHOLE_STATIC_LIBRARIES += socket_static

      $(call import-module,../CustomLibs/libSocket)

    如图:

    4、在Application.mk里面加入-std=c++11,因为源代码里面用到了c++11(VS2012)才有的std::bind和std::function,不支持c++11以下的编译器

    APP_STL := gnustl_static
    APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -DCOCOS2D_DEBUG=1 -std=c++11

    如果是c++11以下的编译器,可以参考:

    “function对于回调函数、将操作作为参数传递等十分有用。它可以看做是C++98标准库中函数对象mem_fun_t, pointer_to_unary_function等的替代品。同样的,bind()也可以被看做是bind1st()和bind2nd()的替代品,当然比他们更强大更灵活。”

    自行改写。。

    使用例子代码,可以拷贝到HelloCpp项目里去测试。

    .h

     1 #ifndef __HELLOWORLD_SCENE_H__
     2 #define __HELLOWORLD_SCENE_H__
     3 
     4 #include "cocos2d.h"
     5 #include "TCPSocket.h"
     6 
     7 class GameScene : public cocos2d::CCLayer
     8 {
     9 public:
    10     // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
    11     virtual bool init();  
    12 
    13     // there's no 'id' in cpp, so we recommend returning the class instance pointer
    14     static cocos2d::CCScene* scene();
    15     
    16     // a selector callback
    17     void menuCloseCallback(CCObject* pSender);
    18     // 注册单个协议回调函数(样例),参数:SOCKET_ID标识,数据包
    19     void process_login(int _tag, WorldPacket & packet);
    20     // 物品更新
    21     void process_openbackpack(int _tag, WorldPacket & packet);
    22     // 注册单个协议回调函数(样例),参数:SOCKET_ID标识,协议头,数据包
    23     bool process_all(int _tag, int _cmd, WorldPacket & packet);
    24     // 连接事件
    25     void OnConnect(int _tag, bool isConnect);
    26     // 断线事件
    27     void onDisconnect(int _tag);
    28     // implement the "static node()" method manually
    29     CREATE_FUNC(GameScene);
    30 };
    31 
    32 #endif // __HELLOWORLD_SCENE_H__


    .cpp

      1 #include "GameScene.h"
      2 #include "AppDelegate.h"
      3 #include "AppMacros.h"
      4 USING_NS_CC;
      5 
      6 CCScene* GameScene::scene()
      7 {
      8     // 'scene' is an autorelease object
      9     CCScene *scene = CCScene::create();
     10     
     11     // 'layer' is an autorelease object
     12     GameScene *layer = GameScene::create();
     13 
     14     // add layer as a child to scene
     15     scene->addChild(layer);
     16 
     17     // return the scene
     18     return scene;
     19 }
     20 void GameScene::process_login(int _tag, WorldPacket & packet)
     21 {
     22     CCLOG("process_login len:%u", packet.size());
     23     // 定义协议包
     24     WorldPacket newP;
     25     newP.clear();    
     26     newP.SetOpcode(0x00B6);// 设置协议头
     27     newP    << uint16(0x00B6) 
     28             << uint16(0);// 协议长度
     29     newP.SetLength(newP.size());// 设置协议长度    
     30     sSocketMgr.SendPacket(1, &newP);// 发送数据
     31 }
     32 
     33 void GameScene::process_openbackpack(int _tag, WorldPacket & packet)
     34 {
     35     CCLOG("process_openbackpack len:%u", packet.size());
     36 }
     37 
     38 bool GameScene::process_all(int _tag, int _cmd, WorldPacket & packet)
     39 {
     40     CCLOG("process_all _tag:%u, _cmd:%u, len:%u", _tag, _cmd, packet.size());
     41     return false;
     42 }
     43 
     44 void GameScene::OnConnect(int _tag, bool isConnect)
     45 {
     46     // 定义协议包
     47     WorldPacket packet;
     48     packet.clear();    
     49     packet.SetOpcode(0x0010);// 设置协议头
     50     packet    << uint16(0x0010) 
     51             << uint16(0)// 协议长度
     52             << uint8(1) 
     53             << uint8(0);
     54     // 加入字符串数据(uint8表示字符串长度所占字节,此处为1字节)
     55     packet.AppendPacketString<uint8>(std::string("aaa:88889083:d5956683c17d7e284d33ee295b277b52"));    
     56     packet.SetLength(packet.size());// 设置协议长度    
     57     sSocketMgr.SendPacket(1, &packet);// 发送数据
     58     CCLOG("OnConnect:%u, isConnect[%u]", _tag, isConnect);
     59 }
     60 
     61 void GameScene::onDisconnect(int _tag)
     62 {
     63     CCLOG("desconnect:%u", _tag);
     64 }
     65 
     66 // on "init" you need to initialize your instance
     67 bool GameScene::init()
     68 {
     69     //////////////////////////////
     70     // 1. super init first
     71     if ( !CCLayer::init() )
     72     {
     73         return false;
     74     }
     75     
     76     CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
     77     CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
     78 
     79     /////////////////////////////
     80     // 2. add a menu item with "X" image, which is clicked to quit the program
     81     //    you may modify it.
     82 
     83     // add a "close" icon to exit the progress. it's an autorelease object
     84     CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
     85                                         "CloseNormal.png",
     86                                         "CloseSelected.png",
     87                                         this,
     88                                         menu_selector(GameScene::menuCloseCallback));
     89     
     90     pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 ,
     91                                 origin.y + pCloseItem->getContentSize().height/2));
     92 
     93     // create menu, it's an autorelease object
     94     CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
     95     pMenu->setPosition(CCPointZero);
     96     this->addChild(pMenu, 1);
     97 
     98     /////////////////////////////
     99     // 3. add your codes below...
    100 
    101     // add a label shows "Hello World"
    102     // create and initialize a label
    103     
    104     CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", TITLE_FONT_SIZE);
    105     
    106     // position the label on the center of the screen
    107     pLabel->setPosition(ccp(origin.x + visibleSize.width/2,
    108                             origin.y + visibleSize.height - pLabel->getContentSize().height));
    109 
    110     // add the label as a child to this layer
    111     this->addChild(pLabel, 1);
    112 
    113     // add "HelloWorld" splash screen"
    114     CCSprite* pSprite = CCSprite::create("HelloWorld.png");
    115 
    116     // position the sprite on the center of the screen
    117     pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
    118 
    119     // add the sprite as a child to this layer
    120     this->addChild(pSprite, 0);
    121     ///////////////////////////////////////////////
    122     // 创建SOCKET管理器
    123     CREATE_TCPSOCKETMGR();    
    124     uint64 t_begin = GetCurrentTime();
    125     // 创建并添加SOCKET,参数:服务器IP,端口,自定义的SOCKET_ID标识
    126     sSocketMgr.createSocket("192.168.0.183", 7502, 1);
    127     uint64 t_end = GetCurrentTime();
    128     // 注册协议,参数:包头,回调函数
    129     sSocketMgr.register_process(0x10, SCT_CALLBACK_2(GameScene::process_login, this));
    130     sSocketMgr.register_process(0x2d, SCT_CALLBACK_2(GameScene::process_openbackpack, this));
    131     // 注册消息截获事件,注册此事件后可以截获收到的所有消息,若回调函数返回true则本次事件会继续分发注册过的协议,返回false则不分发
    132     sSocketMgr.register_connect(SCT_CALLBACK_2(GameScene::OnConnect, this));
    133     sSocketMgr.register_disconnect(SCT_CALLBACK_3(GameScene::onDisconnect, this));
    134 
    135     
    136     CCLOG("GameScene::init end! [%u]", t_end - t_begin);
    137     ///////////////////////////////////////////////
    138     return true;
    139 }
    140 
    141 void GameScene::menuCloseCallback(CCObject* pSender)
    142 {
    143 #if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
    144     CCMessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
    145 #else
    146     CCDirector::sharedDirector()->end();
    147 #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    148     exit(0);
    149 #endif
    150 #endif
    151 }
  • 相关阅读:
    vmware里面的名词 vSphere、vCenter Server、ESXI、vSphere Client
    SQL Server2014 SP2新增的数据库克隆功能
    看完SQL Server 2014 Q/A答疑集锦:想不升级都难!
    Windows Server 2012 NIC Teaming 网卡绑定介绍及注意事项
    最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目
    基于本地存储的kvm虚拟机在线迁移
    SQL Server 数据加密功能解析
    android开发之GestureDetector手势识别(调节音量、亮度、快进和后退)
    Datazen介绍
    jquery智能弹出层,自己主动推断位置
  • 原文地址:https://www.cnblogs.com/elephant-x/p/3363786.html
Copyright © 2020-2023  润新知