【C/S通信交互之SOCKET篇】COCOS2DX(CLIENT)使用BSD SOCKET与MINA(SERVER)手机网游通信框架!

简介:
本站文章均为  李华明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. 对于bsd socket 的  ::connect()函数进行连接服务器的时候会阻塞你的主线程,所以将Himi封装好的connect()函数在另一个线程调用则是一个好的处理方式;否则一旦网络比较差,你的游戏就假死ing~ 悲剧;

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

定义一个线程成员变量:

pthread_t threadHimi;

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

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端 能自动识别找到对应的编码解码类;

相关文章
|
3月前
|
关系型数据库 MySQL 数据库
docker启动mysql多实例连接报错Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’
docker启动mysql多实例连接报错Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’
215 0
|
4月前
|
网络协议 程序员 5G
IM开发者的零基础通信技术入门(十三):为什么手机信号差?一文即懂!
本系列文章尽量使用最浅显易懂的文字、图片来组织内容,力求通信技术零基础的人群也能看懂。但个人建议,至少稍微了解过网络通信方面的知识后再看,会更有收获。如果您大学学习过《计算机网络》这门课,那么一定不要错过本系列文章。
55 0
|
6月前
|
移动开发 开发框架 JavaScript
技术心得记录:手机Web开发框架
技术心得记录:手机Web开发框架
76 0
|
6月前
|
前端开发 Java
基于SSM框架的手机商城项目
基于SSM框架的手机商城项目
60 0
|
网络协议 Android开发
|
关系型数据库 MySQL 数据库
cant connect to local MySQL server through socket /tmp/mysql.sock (2)
cant connect to local MySQL server through socket /tmp/mysql.sock (2)
166 0
cant connect to local MySQL server through socket /tmp/mysql.sock (2)
|
关系型数据库 MySQL 数据库
Can't connect to local MySQL server through socket '/tmp/mysql.sock'
Can't connect to local MySQL server through socket '/tmp/mysql.sock'
95 0
|
网络协议 物联网 数据安全/隐私保护
CC2530+ESP8266与手机APP通信
通过CC2530控制ESP8266将其配置成AP+TCP服务器模式,并通过手机APP连接到TCP服务器并完成数据传输。ESP8266将作为一个热点(AP)来工作,其WiFi模块被配置为建立一个TCP服务器并监听端口号。CC2530将使用其串口与ESP8266进行通信,并通过AT指令控制ESP8266的WiFi模块设置和数据传输。
655 0
|
数据采集 数据可视化 前端开发
漏刻有时数据可视化大屏核心完整版框架PHP后台数据管理 API数据接口 Echarts图表库 自带电脑端和手机端两套模版且支持自定义前端模版开发
漏刻有时数据可视化大屏核心完整版框架PHP后台数据管理 API数据接口 Echarts图表库 自带电脑端和手机端两套模版且支持自定义前端模版开发
217 0
|
缓存 Java
Java NIO实战篇:使用Socket实现报文交互
Java NIO实战篇:使用Socket实现报文交互
234 0