Home  >  Article  >  Database  >  Cocos2dx + Libev + protobuf 实现长连接客户端

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

WBOY
WBOYOriginal
2016-06-07 15:26:401454browse

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





Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:SWFObject2.0两种调用方式Next article:Orion SSH2