下载地址: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

 #ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__ #include "cocos2d.h"
#include "TCPSocket.h" class GameScene : public cocos2d::CCLayer
{
public:
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
virtual bool init(); // there's no 'id' in cpp, so we recommend returning the class instance pointer
static cocos2d::CCScene* scene(); // a selector callback
void menuCloseCallback(CCObject* pSender);
// 注册单个协议回调函数(样例),参数:SOCKET_ID标识,数据包
void process_login(int _tag, WorldPacket & packet);
// 物品更新
void process_openbackpack(int _tag, WorldPacket & packet);
// 注册单个协议回调函数(样例),参数:SOCKET_ID标识,协议头,数据包
bool process_all(int _tag, int _cmd, WorldPacket & packet);
// 连接事件
void OnConnect(int _tag, bool isConnect);
// 断线事件
void onDisconnect(int _tag);
// implement the "static node()" method manually
CREATE_FUNC(GameScene);
}; #endif // __HELLOWORLD_SCENE_H__

.cpp

 #include "GameScene.h"
#include "AppDelegate.h"
#include "AppMacros.h"
USING_NS_CC; CCScene* GameScene::scene()
{
// 'scene' is an autorelease object
CCScene *scene = CCScene::create(); // 'layer' is an autorelease object
GameScene *layer = GameScene::create(); // add layer as a child to scene
scene->addChild(layer); // return the scene
return scene;
}
void GameScene::process_login(int _tag, WorldPacket & packet)
{
CCLOG("process_login len:%u", packet.size());
// 定义协议包
WorldPacket newP;
newP.clear();
newP.SetOpcode(0x00B6);// 设置协议头
newP << uint16(0x00B6)
<< uint16();// 协议长度
newP.SetLength(newP.size());// 设置协议长度
sSocketMgr.SendPacket(, &newP);// 发送数据
} void GameScene::process_openbackpack(int _tag, WorldPacket & packet)
{
CCLOG("process_openbackpack len:%u", packet.size());
} bool GameScene::process_all(int _tag, int _cmd, WorldPacket & packet)
{
CCLOG("process_all _tag:%u, _cmd:%u, len:%u", _tag, _cmd, packet.size());
return false;
} void GameScene::OnConnect(int _tag, bool isConnect)
{
// 定义协议包
WorldPacket packet;
packet.clear();
packet.SetOpcode(0x0010);// 设置协议头
packet << uint16(0x0010)
<< uint16()// 协议长度
<< uint8()
<< uint8();
// 加入字符串数据(uint8表示字符串长度所占字节,此处为1字节)
packet.AppendPacketString<uint8>(std::string("aaa:88889083:d5956683c17d7e284d33ee295b277b52"));
packet.SetLength(packet.size());// 设置协议长度
sSocketMgr.SendPacket(, &packet);// 发送数据
CCLOG("OnConnect:%u, isConnect[%u]", _tag, isConnect);
} void GameScene::onDisconnect(int _tag)
{
CCLOG("desconnect:%u", _tag);
} // on "init" you need to initialize your instance
bool GameScene::init()
{
//////////////////////////////
// 1. super init first
if ( !CCLayer::init() )
{
return false;
} CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); /////////////////////////////
// 2. add a menu item with "X" image, which is clicked to quit the program
// you may modify it. // add a "close" icon to exit the progress. it's an autorelease object
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(GameScene::menuCloseCallback)); pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/ ,
origin.y + pCloseItem->getContentSize().height/)); // create menu, it's an autorelease object
CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
pMenu->setPosition(CCPointZero);
this->addChild(pMenu, ); /////////////////////////////
// 3. add your codes below... // add a label shows "Hello World"
// create and initialize a label CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", TITLE_FONT_SIZE); // position the label on the center of the screen
pLabel->setPosition(ccp(origin.x + visibleSize.width/,
origin.y + visibleSize.height - pLabel->getContentSize().height)); // add the label as a child to this layer
this->addChild(pLabel, ); // add "HelloWorld" splash screen"
CCSprite* pSprite = CCSprite::create("HelloWorld.png"); // position the sprite on the center of the screen
pSprite->setPosition(ccp(visibleSize.width/ + origin.x, visibleSize.height/ + origin.y)); // add the sprite as a child to this layer
this->addChild(pSprite, );
///////////////////////////////////////////////
// 创建SOCKET管理器
CREATE_TCPSOCKETMGR();
uint64 t_begin = GetCurrentTime();
// 创建并添加SOCKET,参数:服务器IP,端口,自定义的SOCKET_ID标识
sSocketMgr.createSocket("192.168.0.183", , );
uint64 t_end = GetCurrentTime();
// 注册协议,参数:包头,回调函数
sSocketMgr.register_process(0x10, SCT_CALLBACK_2(GameScene::process_login, this));
sSocketMgr.register_process(0x2d, SCT_CALLBACK_2(GameScene::process_openbackpack, this));
// 注册消息截获事件,注册此事件后可以截获收到的所有消息,若回调函数返回true则本次事件会继续分发注册过的协议,返回false则不分发
sSocketMgr.register_connect(SCT_CALLBACK_2(GameScene::OnConnect, this));
sSocketMgr.register_disconnect(SCT_CALLBACK_3(GameScene::onDisconnect, this)); CCLOG("GameScene::init end! [%u]", t_end - t_begin);
///////////////////////////////////////////////
return true;
} void GameScene::menuCloseCallback(CCObject* pSender)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
CCMessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
#else
CCDirector::sharedDirector()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit();
#endif
#endif
}

TCPSocket v1.0 for cocos2d-x下载的更多相关文章

  1. RDIFramework.NET平台代码生成器V1.0发布(提供下载)

    RDIFramework.NET平台代码生成器V1.0发布(提供下载)   RDIFramework.NET(.NET快速开发整合框架)框架做为信息化系统快速开发.整合的框架,其目的一至是给用户和开发 ...

  2. 痞子衡嵌入式:超级下载算法RT-UFL v1.0发布,附J-Link下安装教程

    痞子衡主导的"学术"项目 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计> 历时 8 个月终于迎来了 v1.0 版发布,因为是第一个正式版,为了保证质 ...

  3. 《驱蚊神器v1.0》android应用 赶走那些烦人的臭蚊子

    <驱蚊神器v1.0>能够非常好地赶走那些个烦人又恼人伤人的臭蚊子,它总是搞得自己没有好的睡眠或歇息,得努力地拍巴巴掌,这下可好了,也少些烦恼了,先深情地眯缝一会儿...此声波怡人不会对人产 ...

  4. JuiceFS v1.0 beta3 发布,支持 etcd、Amazon MemoryDB、Redis Cluster

    JuiceFS v1.0 beta3 在元数据引擎方面继续增强,新增 etcd 支持小于 200 万文件的使用场景,相比 Redis 可以提供更好的可用性和安全性.同时支持了 Amazon Memor ...

  5. Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(一)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 首先说一下为什么要转换,这是为了后面的A*寻路算法做准备.由于在 ...

  6. 自动化测试管理平台ATMS(V1.0.1_7.29)下载

    自动化测试管理平台ATMS(V1.0.1_7.29)下载http://automationqa.com/forum.php?mod=viewthread&tid=2582&fromui ...

  7. VisualCom软件仿真平台V1.0发布(附安装包下载链接)

    自我们借助VisualCom(暂定名称,后续可能会变更)软件平台撰写技术文章以来,有不少粉丝发私信询问该软件哪里来的,以及哪里有安装包,这里回复一下:VisualCom软件平台是由本微信公众号组织开发 ...

  8. 痞子衡嵌入式:超级下载算法RT-UFL v1.0在恩智浦MCUXpresso IDE下的使用

    痞子衡主导的"学术"项目 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计> v1.0 版发布近 4 个月了,部分客户已经在实际项目开发调试中用上了这个 ...

  9. 痞子衡嵌入式:超级下载算法RT-UFL v1.0在IAR EW for Arm下的使用

    痞子衡主导的"学术"项目 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计> v1.0 版发布近 4 个月了,部分客户已经在实际项目开发调试中用上了这个 ...

随机推荐

  1. C++类型转化

    dynamic_cast在多继承中可以判断无关类之间是否可以转换,例如基类B1和基类B2之间,static_cast可以在隐式转化及其逆转换中进行,但不允许无关类型之间的转换.,dynamic_cas ...

  2. [HDOJ3367]Pseudoforest(并查集,贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3367 求一个无向图上权值最大的伪森林. 伪森林:一个图的连通子图,当且仅当这个子图有且仅有一个环. 既 ...

  3. Android studio中Rendering Problems不能可视化操作的解决办法

    出现:Rendering Problems the following classes could not be found:android.support.v7.internal.widget.Ac ...

  4. C++中求两个正整数的最大公约数和最小公倍数

    最大公约数直接用辗转相除法,最小公倍数就是两个数的乘积除以最大公约数 #include<iostream> using namespace std; int gys(int x,int y ...

  5. gulp自动刷新插件

    gulp自动刷新的插件很多,但是感觉最好用的还是 browser-sync 插件.如果不想用命令行,也可以使用 browser-sync界面工具 先安装 browser-sync 插件: npm in ...

  6. 使用DX绘制3D物体时新手常犯错误,看不见物体时可以一一排查

    1.镜头不对: 物体不在镜头范围内,检查视图矩阵,世界矩阵,投影矩阵. 2.颜色全黑: 打开光照情况下,MATERIAL全为0, 或,在没有打开光照情况下,颜色值为0,造成全黑.检查当前Materia ...

  7. hdu 2986 Ballot evaluation (模拟)

    题目 上次比赛的题目,好长时间了. 这几天感冒了很难受, 直到现在才整理, 上次比赛的时候,出了各种错误,   ,,,样例都没过,题目读的也很差,今天做的时候, 看了一下网上的,发现一个代码特别简洁, ...

  8. 一个简单的iBatis入门例子

    一个简单的iBatis入门例子,用ORACLE和Java测试 目录结构: 1.导入iBatis和oracle驱动. 2.创建类Person.java package com.ibeats;import ...

  9. QSettings介绍

    简介 QSettings类提供了持久的跨平台应用程序设置. 用户通常期望应用程序记住它的设置(窗口大小.位置等)所有会话.这些信息通常存储在Windows系统注册表,OS X和iOS的属性列表文件中. ...

  10. UVa 10256 (判断两个凸包相离) The Great Divide

    题意: 给出n个红点,m个蓝点.问是否存在一条直线使得红点和蓝点分别分布在直线的两侧,这些点不能再直线上. 分析: 求出两种点的凸包,如果两个凸包相离的话,则存在这样一条直线. 判断凸包相离需要判断这 ...