cocos2dx socket 通信

前端之家收集整理的这篇文章主要介绍了cocos2dx socket 通信前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=167


最近做一个联网实时交互的游戏,游戏中需要使用socket保持长连接,来保证客户端与服务器端进行实时交互。以下贴出自己的一些代码

因为socket通信部分需要使用多线程,整个流程如下:

1、首先起一个线程,来进行socket通信的连接

  1. intGameServer::connectThreadStart(){
  2. //connect(GAMESERVER,CCString::create(GAMESERVER_PORT)->intValue());
  3. interrCode=0;
  4. do{
  5. pthread_attr_ttAttr;
  6. errCode=pthread_attr_init(&tAttr);
  7. CC_BREAK_IF(errCode!=0);
  8. errCode=pthread_attr_setdetachstate(&tAttr,PTHREAD_CREATE_DETACHED);
  9. if(errCode!=0){
  10. pthread_attr_destroy(&tAttr);
  11. break;
  12. }
  13. errCode=pthread_create(&m_gameThread,&tAttr,connectSocket,this);
  14. }while(0);
  15. returnerrCode;
  16. }


2、连接socket代码



再此处进行socket连接,如果连接成功之后,将会通知主线程,连接已经成功,此处我们使用了cocos2dx高级开发教程中封装的MTNotificationQueue进行子线程向主线程的通信,如果你不了解,可以自己去百度



3、通知主线程之后,主线程将会负责开启新的线程进行recv监听,监听服务器下发的数据



开启socket通信接收函数

copy
void*GameServer::listenSocketData(void*obj)
  • bytebuffer[5];
  • stringcontents;
  • intret=0;
  • //先接受4字节,获取服务返回长度
  • boolrs=true;
  • while(rs)
  • {
  • contents="";
  • ret=recv(m_socketHandle,buffer,4,0);
  • //服务器关闭
  • if(ret==0)
  • //CCLog("Error:serverclose");
  • rs=false;
  • if(ret==4)
  • buffer[4]='\0';
  • intpacketlen=Utils::bytes2int(buffer);
  • CCLOG("packetlen%d",packetlen);
  • charbuf[packetlen];
  • intrets=0;
  • while((ret=recv(m_socketHandle,buf,packetlen-rets,0))>0)
  • contents.append(buf,ret);
  • packetlen-=ret;
  • if(packetlen<=0)
  • break;
  • CCLog("recvcontent:%s\n",contents.c_str());
  • CCString*str=CCString::create(Utils::getUnPackMsg(contents));
  • MTNotificationQueue::sharedNotificationQueue()->postNotification("receivedata",str);
  • CCLog("Error:recvdataError%d",ret);
  • returnNULL;
  • }



  • 因为我们的cocos2dx客户端与服务器端约定,发送的前四个字节作为发送内容的字节长度,因此首先接收前四个字节,至此,一个多线程socket程序就完成了。

    原文链接:/cocos2dx/340287.html

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