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
[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
我並無作過具體的對比測試,因此無從回答具體性能。但從協議實現上來講,LuaSocket 應該會高些的。WebSocket 由於要實現 HTTP 握手 和 數據幀 ,性能或許會低那麼一點點。 服務器
但從真實應用上來講,這個性能應該是能夠忽略不計了。 websocket
WebSocket 在握手階段必須使用 HTTP協議 ,此時的流量消耗會比 LuaSocket 略高。但鏈接創建以後,就與標準的 TCP 協議相同了。 網絡
LuaSocket 就不說了,標準的 TCP 協議實現,還支持 UDP/FTP/HTTP/DNS/SMTP。 socket
這裏是 WebSocket API 和 LuaSocket API 。毫無疑問,LuaSocket固然更靈活。
靈活和易用彷佛老是一堆矛盾。爲了更方便地使用 LuaSocket ,咱們少不了要本身作一些封裝。這裏有一個 非阻塞的 LuaSocket 封裝 ,能夠參考。
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)
服務端的選擇就更普遍了。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