最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
cocos2dx 使用luasocket
在 Quick-Cocos2d-x 中,默认集成了 LuaSocket 和 WebSocket 两个 Socket 库。在开发需要长连接的手机游戏时,该如何选择这两个库呢?下面将从多个方面进行详细比较:
一、跨平台
- WebSocket:具备跨平台特性,其导出到 Lua 的代码位于
[quick]/lib/cocos2d-x/scripting/lua/cocos2dx_support/Lua_web_socket.cpp。 - LuaSocket:同样是跨平台的,其导出到 Lua 的代码存于
[quick]/lib/cocos2d-x/scripting/lua/lua_extensions/lua_extensions.c。Quick 中集成的 LuaSocket 为 2.1RC 版本。
二、易用性
- WebSocket
- Quick 提供了相关范例,如
[quick]/samples/websockets以及[quick]/samples/cocos2dx_luatest/scripts/ExtensionTest/WebProxyTest.lua。 - 该库封装了一些基本事件,支持
open、message、close、error等,使用起来较为便捷。 - 天生就是非阻塞的。
- LuaSocket
- Quick 未提供 LuaSocket 的范例,但本人为 LuaSocket 编写了一个示例并提交给了 Quick。
- LuaSocket 项目本身提供了众多范例和库,涵盖从 FTP 到 Socket 服务器实现等各个方面。
- 未封装事件支持,但我们可以自行进行封装。它支持阻塞和非阻塞两种方式获取数据。本人在“一个 LuaSocket 封装”中,基于 Quick 框架提供了事件支持。
三、性能
由于未进行具体的对比测试,无法给出确切的性能数据。但从协议实现角度分析,LuaSocket 的性能可能会更高一些。因为 WebSocket 需要实现 HTTP 握手和数据帧,性能或许会稍低一点。不过在实际应用中,这种性能差异通常可以忽略不计。
四、流量
- WebSocket:在握手阶段必须使用 HTTP 协议,此时的流量消耗比 LuaSocket 略高。但连接建立之后,其数据传输与标准的 TCP 协议相同。
- LuaSocket:是标准的 TCP 协议实现,同时还支持 UDP、FTP、HTTP、DNS、SMTP 等协议。
五、灵活性
对比 WebSocket API 和 LuaSocket API,显然 LuaSocket 更为灵活。然而,灵活和易用往往是一对矛盾。为了更方便地使用 LuaSocket,我们需要自行进行一些封装。本人参考 Quick 论坛上非阻塞 Socket 的实现做了一些修改,并在“一个 LuaSocket 封装”这篇文章中进行了详细介绍。
六、二进制编码
- WebSocket:支持可选的二进制数据传输。
- LuaSocket:其
send方法虽只支持字符串,但可以使用string.char()将需要发送的数据转换为二进制编码进行传送,效果与直接传输二进制数据一致。 - Quick 相关支持: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 模块,也有几个完全使用 Lua 实现的位运算库,不过速度会比 C 实现的慢,相关链接:1 2 3。本人基于
lpack封装了一个ByteArray类,用于模仿 ActionScript 中flash.utils.ByteArray的行为,详情可查看:用 Lua 实现 ByteArray。在本人的 LuaSocket 示例中,还提供了PacketBuffer用于数据解析以及粘包处理,可供参考。
七、服务器实现
服务端的选择较为广泛,C、C++、Java、Go、Node.js、Python 等主流语言都有 WebSocket 的开源实现。标准的 TCP Socket 更是网络基础。不过,WebSocket 和标准 Socket 服务器的实现存在区别,主要问题在于 WebSocket 的握手和数据帧方式与标准 Socket 不同。由于服务端已采用标准 Socket 实现,若再转向 WebSocket 则有些多余,因此客户端可将 LuaSocket 进行封装后直接使用。