今天說一下手機游戲通訊協議中的數據問題,大量的數據將給服務器端和客戶端帶來很大的壓力,一般來說。
轉載請注明出處:http://www.cnblogs.com/zisou/p/cocos2dxJQ-8.html
游戲的數據分靜態數據和服務器傳過來的動態數據,靜態數據大部分通過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,通訊質量以及速度將會快很多,以及流量都會節省不少。
我將這個壓縮工具分享一下: