本站文章均为 李华明Himi 原创,转载务必在明显处注明:
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2dx/844.html

          ☞ 点击订阅 ☜
 本博客最新动态!及时将最新博文通知您!

其实对于此篇算是对于这段时间网络研究的一个总结。

对于手游网络通信的交互,一般情况下,Socket长连接直接使用Mina框架即可,对于Http短连接使用Servlet 入口即可(那么对于后期将陆续更新Servlet博文)

那么本篇主要介绍Socket长连接,当然与此配对的跨平台通信则选择了BSD Socket,当然还有其他的,这里只说BSD Socket;

对于BSD Socket不是很熟悉的请自行google学习下,Himi需要提醒大家的是BSD Socket不是第三方类库,而是UNIX/Linux系统中通用的网络接口;

首先连接到Server端,这里Himi简单封装一个函数提供大家使用;

     导入   #include <netdb.h>

两个参数:1:IP地址  2:端口

其中有个socket成员变量:

int socketHandle = 0;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int HSocket::connect( const char * ip, unsigned short port){ 
     struct sockaddr_in sa;
     struct hostent* hp;
     hp = gethostbyname(ip);
     if (!hp){
         return -1;
     }
     memset (&sa, 0, sizeof (sa));
     memcpy (( char *)&sa.sin_addr, hp->h_addr, hp->h_length);
     sa.sin_family = hp->h_addrtype;
     sa.sin_port = htons(port);
     socketHandle = socket(sa.sin_family, SOCK_STREAM, 0);
     if (socketHandle < 0){
         printf ( "failed to create socket\n" );
         return -1;
     }
     if (::connect(socketHandle, (sockaddr*)&sa, sizeof (sa)) < 0){
         printf ( "failed to connect socket\n" );
         ::close(socketHandle);
         return -1;
     }
     CCLOG( "Client connect OK ! IP: %s:%d " ,ip,port);
     return 0;
}

两点注意:

1. 对于bsd socket 的  ::connect()函数进行连接服务器的时候会阻塞你的主线程,所以将Himi封装好的connect()函数在另一个线程调用则是一个好的处理方式;否则一旦网络比较差,你的游戏就假死ing~ 悲剧;

2. 对于线程我们直接使用 pThread 就可以了,那么这里Himi就给一个创建线程的例子吧:

定义一个线程成员变量:

pthread_t threadHimi;

然后Himi也为大家封装一个函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int HSocket::threadStart(){
     int errCode = 0;
     do {
         pthread_attr_t tAttr;
         errCode = pthread_attr_init(&tAttr);
         CC_BREAK_IF(errCode!=0)
         errCode = pthread_attr_setdetachstate(&tAttr, PTHREAD_CREATE_DETACHED);
         if (errCode!=0) {
             pthread_attr_destroy(&tAttr);
             break ;
         }
         errCode = pthread_create(&threadHimi, &tAttr, thread_function, this );
     } while (0);
     return errCode;
}

1)创建线程其实就是pthread_create()函数,但是上面这个函数其他内容则主要为你创建的线程设定为分离式;这里 thread_function 是个函数童鞋们对于pthread不太熟悉的请自行百度和google;

2)当然这里Himi要提醒大家,pthread是c库,不是c++库,它要求是全局函数,所以得static的!

那么连接到Server端之后我们就应该关心, BSD Socket  对于数据的发送和接收!

1.发送: send 函数:

send(socketHandle,buffer,length,0)

socketHandle :  你已经连接的socket

buffer:发送的缓存数据

length:数据长度

2. 接收: recv 函数:

recv(socketHandle, p, length, 0)

socketHandle  :  你已经连接的socket

p : 存放数据的容器

length:获取服务器数据的长度;

 注意:          

1. 对于recv 函数的其中参数 length长度,大家务必要仔细,很清楚服务器应该发来的数据长度,因为一旦recv函数执行,那么不从Server端读取出length长度就不会罢休的!

 2.  如果你的Server端是Java的,那么要注意大端 ,小端的问题!Java属于大端模式,c++属于小端模式;(对于大小端不熟悉的,也请自行google,这里仍旧不赘述)

所以:

              Client->recv到数据后->数据转换成小端

              Client->send数据时->数据转换成大端

     这样才能保证Java服务器与cocos2dx的Client端正常交互;

—–上面一直在介绍Client端的知识,那么下面简单说下Server端Mina的相关知识吧——

其实对于Mina框架而言,功能强大使用简单,我们不需要关心通信,而只是需要关心数据的处理;当然对于数据的处理在Mina中最主要的就是取决于自定义的Decode 和 Encode,编码解码;

一般情况下定义好通信的数据结构,是比较关键的一点;

1. 比如一般数据都有数据头的概念,其中数据头用来标识当前通信的数据的版本,标识和真实数据的长度等等。(至于如何设计这个看大家自己的想法了);

2. 数据结构中更不能少的肯定还是协议号!根据协议号,客户端和服务器才能做同一件事情;

3. 当然其中我们还会使用MD5 或者 CRC等进行数据较验等,对于MD5和CRC校验不太熟悉的也请自行google = =。

定义好数据结构后,如同Client端与Server签订了合同,彼此遵循此结构进行交互;

Server端对于收发数据的处理其实在Mina中比较容易,通过Himi的Mina博文也可以清晰容易的懂得;但是如何能让服务器根据协议号找到对应的编码解码类去处理那么才是重点;Himi这里只简单提醒你创建一个抽象类;

OK,关于数据的存放,当然Himi这里使用的Hibernate 的Annotation映射到Mysql中。比较轻松愉快~

其实Himi以上说的虽然不是很详细,比如Client端对于Server端数据的细节处理等等;但是大概的手机网游框架和大家需要去掌握的知识点基本都没有遗漏,只要童鞋们对于文章中的所有知识点都了如指掌,OK。你Socket C/S手游框架即可开工;

下面Himi放出一张近来对于Server端的成绩图:

(Client 端:cocos2dx  /  Server端:Mina)

Client  特点: 当服务器端有数据发送给Client端,Client端自动将收到的数据索引到对应等待数据的类中;

Server 特点: 当客户端有数据发送Server端,Server端 能自动识别找到对应的编码解码类;

【C/S通信交互之Socket篇】Cocos2dx(Client)使用BSD Socket与Mina(Server)手机网游通信框架!相关推荐

  1. 手机网游制造之请求处理篇(已发《电脑报》)

    目标手机软件 手机网游制造之 请求处理篇 开发程序:疯狂的炸弹 开发进度:第四期 本期要点:设计服务器端请求处理功能 开发平台:Java平台 经过前面3期的讲解,我们的手机网游<疯狂的炸弹> ...

  2. 手机网游制造之游戏界面篇(已发电脑报)

    目标手机软件 手机网游制造之 游戏界面篇 开发程序:疯狂的炸弹 开发进度:第一期 本期要点:设计客户端游戏功能 开发平台:Java平台 从3G中受益的行业,一定少不了手机网游,手机网游应该怎么开发呢? ...

  3. lwip网络通信socket_lwIP在Socket模式下接口:BSD Socket API

    http://home.eeworld.com.cn/my/space-uid-162102-blogid-52270.html 2011 原文: 关于BSD Socket API 在网上找到的两个网 ...

  4. 你妹都看得懂的手机网游制作教程(第21篇)游戏黑屏了,别急我们来调试代码

    诶!为什么我跟着教程做,出来的确实一团黑乎乎的画面. 恭喜你!百分之九十九的可能是 你的某行代码可能在你不经意之时时候书写错误了. 所以 你有一个很好的机会来了解.你究竟犯下了什么错误.然后以后不保证 ...

  5. 【游戏行业观察】篇1:成龙与《传奇》:传统网游营销模式的变迁

    前一阵子逛B站,好多<成龙劝学>的鬼畜. 来源:B站几位鬼畜大佬 众多up将成龙老师早年做客儿童节目劝解小朋友们不要贪玩娱乐的视频,与成龙代言网页游戏<传奇>的短视频素材做成混 ...

  6. WEB通信交互的几种方式

    WEB通信交互的几种方式 - 实时通信发展过程简介 简单介绍一下现在的WEB通信有以下几种方式:最基本的http请求方式,Ajax轮询,Ajax长轮询,HTML5推送事件,HTML5的WebSocke ...

  7. TOP100summit2017:网易云通信与视频CTO赵加雨:外力推动下系统架构的4个变化趋势...

    壹佰案例:很荣幸邀请到您成为第六届壹佰案例峰会架构专场的联席主席,您曾深度参与Cisco Jabber,Webex Meeting, Cisco Spark等多项分布式实时通信类产品的架构与研发,您觉 ...

  8. TOP100summit2017:网易云通信与视频CTO赵加雨:外力推动下系统架构的4个变化趋势

    壹佰案例:很荣幸邀请到您成为第六届壹佰案例峰会架构专场的联席主席,您曾深度参与Cisco Jabber,Webex Meeting, Cisco Spark等多项分布式实时通信类产品的架构与研发,您觉 ...

  9. flask与js交互的示例代码_QT5.12 C++与前端JavaScript/HTML实现通信交互

    "WebSocket connection to 'ws://localhost:12345/' failed: Error in connection establishment: net ...

最新文章

  1. 微信公众号扫描带参数二维码实现自动分组?
  2. springboot-嵌入式Servlet容器(Tomcat)源码分析以及容器切换
  3. css字体自定义,bootstrap自定义字体
  4. Windows下编译配置Caffe的GPU版本
  5. 修改同一张表的同一个字段的两个不同的值。
  6. Windows下后台运行cmd启动的程序
  7. Machine Learning Concepts
  8. pod镜像拉取策略、重启容器策略
  9. linux w3m命令
  10. 计算机视觉的测试数据集,自动驾驶数据集整理
  11. Racket编程指南——17 创造语言
  12. 阳光房行业现状调研及趋势分析报告
  13. springboot实现oos上传下载
  14. excel标题行列浮动显示/冻结窗口
  15. Android通用的搜索框
  16. SAT阅读8道填空练习题精选
  17. java-net-php-python-ssm高校综合素质测评系统计算机毕业设计程序
  18. 微信小程序框架(五)-全面详解(学习总结---从入门到深化)
  19. 怎样编写一个chatgpt聊天网页
  20. HRNet代码及原理分析(一)-- 网络结构

热门文章

  1. FDTD学习之偶极子光源的purcell值
  2. 辛巴学院-Unity-剑英陪你零基础学c#系列(一)Hello World
  3. 什么是DC / AC / OC 机房?
  4. HanLP 部署及NLP+ML双生树思维导图
  5. 该结束这忙忙碌碌却又碌碌无为的生活了
  6. qq2007bate3协议分析
  7. 为什么脑子里有电波声_为什么有时会听到“电波声”?
  8. 微信开发.Net 接入示例
  9. 一图说明什么是 java 中 pojo类
  10. background-attachment 没有效果