cocos2dx 使用luasocket

2015年02月27日 11:57 0 点赞 0 评论 更新于 2025-11-21 13:28

在 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
  • 该库封装了一些基本事件,支持 openmessagecloseerror 等,使用起来较为便捷。
  • 天生就是非阻塞的。
  • 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 进行封装后直接使用。