Cocos2d-X中使用Socket

前端之家收集整理的这篇文章主要介绍了Cocos2d-X中使用Socket前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

转载:http://www.jb51.cc/article/p-xcrjsaew-za.html

Socket又称"套接字",用于向网络发出请求或者应答网络请求

Socket工作的示意图:

程序实例:在Cocos2d-X中使用Socket

创建一个Sock类,用于处理Socket

在Sock.h中添加下面的代码

  1. #ifndef__Sock_H__
  2. #define__Sock_H__
  3. #ifdefWIN32
  4. #include<WinSock2.h>
  5. #defineSOCK_TYPESOCKET
  6. #else
  7. #defineSOCK_TYPEint
  8. #defineINVALID_SOCKET-1
  9. #endif
  10. #defineMyLog(...)
  11. //创建Sock类
  12. classSock
  13. {
  14. public:
  15. //构造函数
  16. Sock();
  17. //析构函数
  18. virtual~Sock();
  19. //设置成非阻塞模式
  20. boolsetNonBlock()
  21. SOCK_TYPEfd=_fd;
  22. #ifdefWIN32
  23. BOOLflg=TRUE;
  24. //控制Socket的模式
  25. if(ioctlsocket(fd,FIONBIO,(unsignedlong*)&flg)!=0)
  26. returnfalse;
  27. }
  28. true;
  29. #else
  30. intflags=fcntl(fd,F_GETFL,0);
  31. flags|=O_NONBLOCK;
  32. returnfcntl(fd,F_SETFL,flags)!=-1;
  33. }
  34. //关闭Sock
  35. voidclose()
  36. {
  37. closesocket(_fd);
  38. ::close(_fd);
  39. voidattach(SOCK_TYPEfd)
  40. _fd=fd;
  41. //判断Sock是否合法
  42. boolisValidSocket()
  43. return_fd!=INVALID_SOCKET;
  44. protected:
  45. SOCK_TYPE_fd;
  46. };
  47. //客户端的Sock
  48. classSockClient:publicSock
  49. SockClient(unsignedshortport=0,constchar*ip=NULL)
  50. if(port==0&&ip==NULL)
  51. return;
  52. //连接
  53. connect(port,ip);
  54. //析构函数
  55. ~SockClient(){}
  56. //第一个参数:端口
  57. //第二个参数:ip地址
  58. intconnect(unsignedshortport,87); background-color:inherit; font-weight:bold">char*ip)
  59. //分配一个Socket
  60. //第一个参数:AF_INET表示指定地址族(地址描述)
  61. //第二个参数:SOCK_STREAM表示流式套接字TCP(Socket类型)
  62. //第三个参数:0(协议)
  63. _fd=socket(AF_INET,SOCK_STREAM,0);
  64. //地址信息结构
  65. structsockaddr_inaddr;
  66. //地址家族
  67. addr.sin_family=AF_INET;
  68. //端口号
  69. addr.sin_port=htons(port);
  70. //主机地址
  71. addr.sin_addr.s_addr=inet_addr(ip);
  72. //连接
  73. intret=::connect(_fd,(structsockaddr*)&addr,153); background-color:inherit; font-weight:bold">sizeof(addr));
  74. if(ret<0)
  75. MyLog("connecterrorerrno=%d",errno);
  76. return-1;
  77. return0;
  78. //接收
  79. intrecv(char*buf,intlen)
  80. return::recv(_fd,buf,len,0);
  81. //发送
  82. intsend(return::send(_fd,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> };
  83. //服务器端的Sock
  84. classSockServer: SockServer(unsigned//监听
  85. listen(port,ip);
  86. //虚构函数
  87. ~SockServer(){}
  88. //接受连接
  89. SockClient*accept()
  90. //接受客户端的发送请求,等待客户端发送connect请求
  91. SOCK_TYPEfd=::accept(_fd,NULL,NULL);
  92. if(fd!=INVALID_SOCKET)
  93. //创建一个SockClient
  94. SockClient*ret=newSockClient;
  95. ret->attach(fd);
  96. returnret;
  97. returnNULL;
  98. //第一个参数:端口
  99. //第二个参数:ip地址
  100. intlisten(unsignedchar*ip=NULL)
  101. //分配一个Socket
  102. //第一个参数:AF_INET表示指定地址族(地址描述)
  103. //第二个参数:SOCK_STREAM表示流式套接字TCP(Socket类型)
  104. //第三个参数:0(协议)
  105. _fd=socket(AF_INET,0);
  106. //地址信息结果
  107. structsockaddr_inaddr;
  108. //地址家族
  109. addr.sin_family=AF_INET;
  110. //端口号
  111. addr.sin_port=htons(port);
  112. if(ip==NULL)
  113. //设置一个不确定的ip地址
  114. addr.sin_addr.s_addr=INADDR_ANY;
  115. else
  116. //将ip地址转换为32位二进制网络字节序的IPV4地址
  117. //绑定
  118. intret=bind(_fd,153); background-color:inherit; font-weight:bold">sizeof(addr));
  119. if(ret<0)
  120. MyLog("binderror");
  121. return-1;
  122. //设置成非阻塞
  123. this->setNonBlock();
  124. //监听
  125. ::listen(_fd,10);
  126. return0;
  127. #endif

在Sock.cpp中添加下面的代码

copy
    #include"Sock.h"
  1. //构造函数
  2. Sock::Sock():_fd(INVALID_SOCKET)
  3. //初始化Windoes下的Sock
  4. staticboolwinInit=false;
  5. if(!winInit)
  6. winInit=true;
  7. WSADATAdata;
  8. WSAStartup(MAKEWORD(2,2),&data);
  9. //虚构函数
  10. Sock::~Sock()
  11. if(isValidSocket())
  12. close();
  13. }


再创建一个SocketTest类,用于测试Socket

在SocketTest.h中添加下面的代码

    #ifndef__SocketTest_H__
  1. #define__SocketTest_H__
  2. #include"cocos2d.h"
  3. USING_NS_CC;
  4. classSocketTest:publicCCLayer
  5. public:
  6. staticCCScene*scene();
  7. CREATE_FUNC(SocketTest);
  8. boolinit();
  9. SockServer*_server;
  10. SockClient*_client;
  11. //启动服务器
  12. voidmakeServer(CCObject*);
  13. //启动客服端
  14. voidmakeClient(CCObject*);
  15. //接受连接
  16. voidAccept(CCObject*);
  17. //发送
  18. voidSend(CCObject*);
  19. voidRecv(CCObject*);
  20. #endif

在SocketTest.cpp中添加下面的代码

    #include"SocketTest.h"
  1. CCScene*SocketTest::scene()
  2. CCScene*s=CCScene::create();
  3. SocketTest*layer=SocketTest::create();
  4. s->addChild(layer);
  5. returns;
  6. boolSocketTest::init()
  7. CCLayer::init();
  8. CCMenuItemFont*item1=CCMenuItemFont::create("MakeServer",153); background-color:inherit; font-weight:bold">this,menu_selector(SocketTest::makeServer));
  9. CCMenuItemFont*item2=CCMenuItemFont::create("MakeClient",menu_selector(SocketTest::makeClient));
  10. CCMenuItemFont*item3=CCMenuItemFont::create("Send",menu_selector(SocketTest::Send));
  11. CCMenuItemFont*item4=CCMenuItemFont::create("Recv",menu_selector(SocketTest::Recv));
  12. CCMenuItemFont*item5=CCMenuItemFont::create("Accept",menu_selector(SocketTest::Accept));
  13. CCMenu*menu=CCMenu::create(item1,item2,item3,item4,item5,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> addChild(menu);
  14. menu->alignItemsVertically();
  15. //启动服务器
  16. voidSocketTest::makeServer(CCObject*)
  17. this->_server=newSockServer(9888);
  18. if(!this->_server->isValidSocket())
  19. CCLog("serverERR");
  20. else
  21. CCLog("serverOK");
  22. voidSocketTest::makeClient(CCObject*)
  23. this->_client=newSockClient(9888,"127.0.0.1");
  24. this->_client->isValidSocket())
  25. CCLog("ClientERR");
  26. CCLog("ClientOK");
  27. voidSocketTest::Accept(CCObject*)
  28. this->_server->accept();
  29. CCLog("AcceptERR");
  30. CCLog("AcceptOK");
  31. voidSocketTest::Send(CCObject*)
  32. //发送信息
  33. intret=this->_client->send("Hello",6);
  34. CCLog("send:retis%d",ret);
  35. voidSocketTest::Recv(CCObject*)
  36. charbuf[128];
  37. //接收信息
  38. this->_client->recv(buf,153); background-color:inherit; font-weight:bold">sizeof(buf));
  39. CCLog("recvbufis%s",buf);
  40. }

执行结果:


测试SocketTest:

启动两个SocketTest程序,一个做服务器一个做客户端

服务器上单击makeServer,启动服务器

打印Server Ok表示服务器启动成功


客户端单击makeClient,启动客户端



服务器上单击Accept,连接客户端

打印Accept Ok表示接受连接


客户端单击Send,客户端发送消息到服务器


服务器上单击Recv,接收服务器上发来的消息

打印出了"recv buf is Hello"表示服务器上收到了客户端发送的消息


服务器上单击Send,服务器发送消息到客户端

打印出了“send: ret is 6”表示服务器成功的向客户端发送了一个消息



客服端上单击Recv,客户端接收服务器发来的消息

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