http://blog.csdn.net/cocosviva/article/details/9304289
ccnet提供的是一套跨3平台 win32 android linux ios 的网络通信解决方案,CSocket封装了提供的IO操作,采用select无阻塞IO读写实现。
CSocket //提供了IO封装,对开发者透明
CNetBean //管理一个TCP长连接的生命周期,读写数据
CStream //提供字节流封装,读写
所有需要使用到ccnet的地方,只需要#include "ccnet/net.h" 即可
管理一个网络生命的周期,需要继承自CNetBean,例如
登陆服务器的连接对象(CLoginNetBean : CNetBean)
游戏主逻辑的连接对象(CLogicNetBean : CNetBean)
地图服务器的连接对象(CMapNetBean : CNetBean)
在设置好目标IP地址和端口号之后,就可以调用connect()进行连接,连接成功会调用onConnected(),连接中发生错误onConnectError,连接超时onConnectTimeout,连接超时的时间默认是10秒,根据需求自行修改。
继承自CNetBean的网络对象,需要定义DEFINE_SINGLE_FUNCTION(xx)来实现单例。以便在全局使用sharedNetBean()来获得网络对象的实例,另外CNetBean的检测读写操作必须通过调用drive()方法来进行,也就是说,每帧必须要调用drive(),开发者可以注册一个schedule,之后每帧调用drive,如果有ccbase的配合,可以注册一个全局的Looper,在loop的帧调用方法中,调用drive()。
write()方法需要传递一个CStream对象,处于连接状态时,在任意的位置调用即可。
onMessage()方法带回一个CStream对象,根据具体的业务逻辑去读响应位置的字节。
比较重要的一点,在CNetBean里有一个宏
//接收数据是否开启封包组包算法
#define CLIP_PACKET 1
这个宏开始是来控制长度字节的,如果开启了这个宏表示在发包的过程中,会在数据包之前加4个字节,表示整个数据包的长度,而在收包的时候,会先读取4个字节int,表示之后要收的包的长度,这个算法主要为了解决网络通信的过程中,发的数据包量过大导致粘包的问题。