今天说一下手机游戏通讯协议中的数据问题,大量的数据将给服务器端和客户端带来很大的压力,一般来说。
游戏的数据分静态数据和服务器传过来的动态数据,静态数据大部分通过lua,xml,csv等格式来存储使用。
动态数据则由服务器发给我们了,不管是用弱联网还是强联网,往往服务器会发送大量的一些数据给客户端接收,
如果思路设计的不好,往往发送接受而不止一次,那么遇到这样的服务器客户端交互的大数据问题只能靠压缩和解压来处理了,
压缩后不但可以将大数据变小,还可以为用户节省流量,一举多得的事情是非常赞的。
最近我的一个项目就使用了这个压缩和解压工具,源码是C写的,所以可以放心的跨平台使用。
下面我说一下具体使用的细节:
1,在使用之前需要先初始化一下,且初始化一次就好,放在构造函数中
//消息压缩加密 if (lzo_init() != LZO_E_OK) { printf("internal error - lzo_init() failed !!!\n"); printf("(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable '-DLZO_DEBUG' for diagnostics)\n"); }
2,在给服务器发送的时候也可以压缩,压缩方法如下:
lzo_uint in_len; lzo_uint out_len; lzo_bytep in_last = (lzo_bytep)json_data; in_len = strlen(json_data); if (lzo1x_1_compress(in_last,in_len,outlast,&out_len,wrkmem) == LZO_E_OK) { printf("compressed %lu bytes into %lu bytes\n", (unsigned long) in_len, (unsigned long) out_len); } else { CCLOG("错误了!"); return 0; }
3,接收到服务器数据的时候进行解压,当然在这时,接受的到包是压缩后的包,而且直接接收到的压缩包直接输出是看不到值的,但包的大小
是可以通过服务器获取,所以解包的时候和上面是相反的;
lzo_uint old_len; lzo_uint new_len; char *strbuff_cc = new char[REC_BUFSIZE]; memset(strbuff_cc, 0, REC_BUFSIZE); old_len = allsize; if (lzo1x_decompress((lzo_bytep)buffer_all,allsize,(lzo_bytep)strbuff_cc,&new_len,NULL) == LZO_E_OK) { printf("decompressed %lu bytes back into %lu bytes\n", (unsigned long) new_len, (unsigned long) old_len); } else { CCLOG("解压err!"); } strbuff = string(strbuff_cc); if(strbuff.length()>0) { SocketThread::paserBody(strbuff); int num = strlen(strbuff.c_str()); CCLOG("all package >>>>>%s,and size:%d",strbuff.c_str(),num); CCLOG("package size:%d",num); }
Ok,我们来看一些效果,将使你会大吃一惊的!
已将包大小为16567 的解压出来为123768 ,12K的东西压缩为1K,通讯质量以及速度将会快很多,以及流量都会节省不少。
我将这个压缩工具分享一下: