Cocos2dx + Libev + protobuf 实现长连接客户端
项目中需要使用socket和服务器连接,因为以前使用过libev来作为服务器,所以就懒得再去写一套,而想到直接使用。但是libev其实为了处理一个服务器能够处理多个客户端的连接,所以用在客户端没有太大的必要。 protobuf作为二进制传输的协议倒是非常适合,编码
项目中需要使用socket和服务器连接,因为以前使用过libev来作为服务器,所以就懒得再去写一套,而想到直接使用。但是libev其实为了处理一个服务器能够处理多个客户端的连接,所以用在客户端没有太大的必要。
protobuf作为二进制传输的协议倒是非常适合,编码解析效率比xml,json高,而且向上向下兼容。
另外,本人使用的cocos2d-x版本为2.X。
---------2014/06/26------- 把以前欠的债还一还
首先是libev部分
libev 是一个异步的I/O框架,效率较高,考虑到游戏中会连接游戏服务器,聊天服务器等,只需要在libev上监听两个Socket即可。
网络部分的代码已经上传到https://github.com/liwanghong/cocos2dx-network-extension,可以下载。
但是这部分代码目前有两个比较严重的问题,因为目前还在开发阶段,就暂时没有解。
问题一:SocketClient的connect在UI线程里面连接服务器,如果网络不畅通会导致程序启动时卡住。这个解法可以把connect放到网络线程中,虽然问题严重,但是解法简单。
问题二:不是Bug,但是由于win32/linux socket接口不一致,导致SocketClient中太多平台相关代码,该问题需要等后期优化时整理。
平台编译:
位置随便放了,我放在extension/network里面,android,iOS除了Socket*几个文件需要添加之外还需要添加libev/ev.h ev.c event.h event.c config.h, windows只需要libev/
evwrap.h evwrap.c
接口说明:
接口基本参考HttpClient实现,SocketClient负责管理发送和接收请求,SocketRequest用于发送请求,SocketResponse用于返回数据。不同的是SocketClient可以接收push消息,只需要注册回调接口处理Push消息即可。
注意事项:
1. 我的服务器数据接收和发送时是和我的编码/解码格式相关,如果需要使用,本代码仅供参考
2. lua的绑定以及脚本引擎的接入是我自己做的,代码未添加上,所以如果直接用,回调函数的脚本接入部分会编译不过。
上一篇: Oracle的redo 和undo的区别
下一篇: PHP数组实现单链表的具体代码分享