一个LuaSocket封装

2014-01-10更新: SocketTCP 已经进入 quick-cocos2d-x 的 framework.



quick-cocos2d-x 中的 socket 技术选择:LuaSocket 和 WebSocket 一文中,我提到了选择 LuaSocket 与服务器通信。

为了方便使用,我对LuaSocket进行了封装。封装主要做了这样几件事:

  1. 封装基于 LuaSocket 的 TCP 模式,使用 settimeout 实现异步调用;
  2. 利用 cocos2d-x 提供的定时器实现失败重连;
  3. 利用 quick-cocos2d-x 提供的 framework.api.EventProtocol 实现了事件的注册和发布。

这个封装完全依赖 quick-cocos2d-x ,因此不能单独在lua环境中使用。

这个封装修改自 quick 论坛的一个源码 ,感谢原作者!

下面的例子依赖 ByteArray,详情看这里:用lua实现ByteArray和ByteArrayVarint

socket = SocketTCP.new("192.168.18.22", 12001, false)
socket:addEventListener(SocketTCP.EVENT_CONNECTED, onStatus)
socket:addEventListener(SocketTCP.EVENT_CLOSE, onStatus)
socket:addEventListener(SocketTCP.EVENT_CLOSED, onStatus)
socket:addEventListener(SocketTCP.EVENT_CONNECT_FAILURE, onStatus)
socket:addEventListener(SocketTCP.EVENT_DATA, onData)

socket:send(ByteArray.new():writeByte(0x59):getPack())

function onStatus(__event)
    echoInfo("socket status: %s", __event.name)
end

function onData(__event)
    echoInfo("socket status: %s, data:%s", __event.name, ByteArray.toString(__event.data))
end

SocketTCP 位于我的 lua库 项目中。

在实际使用的过程中,要处理数据粘包、协议解析、数据还原、数据压缩之类的具体情况,因此我写了一个 sample 来说明如何使用 ByteArray 和 SocketTCP 来做这些事。具体请参考:基于QUICK-COCOS2D-X的LUASOCKET范例

这个范例已经被我提交到了 quick-cocos2d-x sample


我会把自己在游戏中常用的 lua 功能陆续整合进入这个开源库,就像我的 as3库java库 一样。

留言