当前位置:Gxlcms > mysql > Cocos2dx+Libev+protobuf实现长连接客户端

Cocos2dx+Libev+protobuf实现长连接客户端

时间:2021-07-01 10:21:17 帮助过:43人阅读

项目中需要使用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的绑定以及脚本引擎的接入是我自己做的,代码未添加上,所以如果直接用,回调函数的脚本接入部分会编译不过。

人气教程排行