quick-cocos2d-x 中的 socket 技術選擇:LuaSocket 和 WebSocket

在 quick-cocos2d-x 中,默認集成了 LuaSocket 和 WebSocket 兩個 Socket 庫。那麼,在開發須要長鏈接的手機遊戲時,應該選擇哪一個庫呢?下面從幾個方面進行比較:
  1. 跨平臺;
  2. 易用性;
  3. 性能;
  4. 流量;
  5. 靈活性;
  6. 二進制編碼;
  7. 服務器實現。

1、跨平臺

WebSocket 是跨平臺的,其導出到lua的代碼位於[quick]/lib/cocos2d-x/scripting/lua/cocos2dx_support/Lua_web_socket.cpp。 php

LuaSocket 也是跨平臺的,其導出到lua的代碼位於[quick]/lib/cocos2d-x/scripting/lua/lua_extensions/lua_extensions.c。quick 中集成的 LuaSocket 是 2.1RC 版本。 html

2、易用性

[quick]/samples/websockets 是quick提供的一個WebSocket範例。[quick]/samples/cocos2dx_luatest/scripts/ExtensionTest/WebProxyTest.lua也是一個範例。WebSocket 庫封裝了一些基本的事件支持 open/message/close/error ,在使用的時候比較方便。 html5

WebSocket 天生就是非阻塞的。 git

在 quick 中,並無提供 LuaSocket 的範例。好在該項目自己提供了 很多範例 和  。從 ftp 到 socket 服務器實現,應有盡有了。 github

LuaSocket 並無封裝事件支持。不過咱們徹底能夠本身來封裝。LuaSocket 支持阻塞和非阻塞的方式獲取數據。 web

3、性能

我並無作過具體的對比測試,因此無從回答具體性能。但從協議實現上來講,LuaSocket 應該會高些的。WebSocket 由於要實現 HTTP 握手 和 數據幀 ,性能或許會低那麼一點點。 服務器

但從真實應用上來講,這個性能應該是能夠忽略不計了。 websocket

4、流量

WebSocket 在握手階段必須使用 HTTP協議 ,此時的流量消耗會比 LuaSocket 略高。但鏈接創建以後,就與標準的 TCP 協議相同了。 網絡

LuaSocket 就不說了,標準的 TCP 協議實現,還支持 UDP/FTP/HTTP/DNS/SMTP。 socket

5、靈活性

這裏是 WebSocket API 和 LuaSocket API 。毫無疑問,LuaSocket固然更靈活。

靈活和易用彷佛老是一堆矛盾。爲了更方便地使用 LuaSocket ,咱們少不了要本身作一些封裝。這裏有一個 非阻塞的 LuaSocket 封裝 ,能夠參考。

6、二進制編碼

WebSocket 支持可選的二進制數據傳輸。LuaSocket 的 send 方法雖然只支持 string ,但其實咱們徹底能夠用 string.char() 把須要發送的數據轉成二進制編碼來傳送,效果實際上是一致的。

quick 中封裝了lpack,可以更方便的把 lua 中的值轉換成二進制數據。而 quick 自帶的 luajit 還帶有 BitOp 庫,支持經常使用的二進制操做。這些都能直接使用,既能用於 WebSocket, 也能用於 LuaSocket。

例以下面這段混用了 lpack 和 BitOp 庫的代碼:

require("bit") require("pack")
local __pack = string.pack("<b3ihb5", 0x59, 0x7a, 0, 11, 1101, 0, 3,
bit.bor(0,0), bit.bor(bit.lshift(1,3), 0), bit.bor(bit.lshift(2,3), 0))

local __s = string.gsub(__pack,"(.)",function (x) return string.format("%02d ",string.byte(x)) end) print(__s) 

7、服務器實現

服務端的選擇就更普遍了。C/C++/JAVA/Go/Node.js/Python 等主流語言都有 WebSocket 的開源實現。標準的 TCP Socket 就更不用說了,那個是網絡基礎好吧。

可是,WebSocket 和 標準Socket 服務器的實現,仍是有區別的。主要的問題在於WebSocket的 握手 和 數據幀 方式與標準Socket不一樣。

因爲咱們的服務端已經採用標準Socket實現,再轉向 WebSocket 就有點畫蛇添足。因此我這個客戶端就苦B一點把,把 LuaSocket 封裝一下直接用了。




bsdsocket + protobuf

http://blog.csdn.net/zzhboy/article/details/9878941

相關文章
相關標籤/搜索