开发者社区> ghost丶桃子> 正文

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Java 网络编程】TCP API 简介 ( Socket | ServerSocket )
【Java 网络编程】TCP API 简介 ( Socket | ServerSocket )
89 0
nodejs TCP服务器和客户端通信的socket结构
这个结构我们大学时上Unix网络编程的专业课就学过了:
55 0
TCP socket和web socket的区别
TCP socket和web socket的区别
94 0
高质量通信gRPC入门,有了它,谁还用Socket
高质量通信gRPC入门,有了它,谁还用Socket
704 0
基于 IOCP 的通用异步 Windows Socket TCP 高性能服务端组件的设计与实现
设计概述   服务端通信组件的设计是一项非常严谨的工作,其中性能、伸缩性和稳定性是必须考虑的硬性质量指标,若要把组件设计为通用组件提供给多种已知或未知的上层应用使用,则设计的难度更会大大增加,通用性、可用性和灵活性必须考虑在内。
1233 0
通用异步 Windows Socket TCP 客户端组件的设计与实现
编写 Windows Socket TCP 客户端其实并不困难,Windows 提供了6种 I/O 通信模型供大家选择。但本座看过很多客户端程序都把 Socket 通信和业务逻辑混在一起,剪不断理还乱。
928 0
内核中的UDP socket流程(2)——API “sys_socket”
内核中的UDP socket流程(2)——API “sys_socket” 作者:gfree.wind@gmail.com 原文:http://blog.chinaunix.
1096 0
+关注
ghost丶桃子
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
TCP Cluster for mqtt技术实施方案
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载