一个LuaSocket封装

  • 本站文章除注明转载外,均为本站原创或者翻译。
  • 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商;
  • 本站部分原创和翻译文章提供markdown格式源码,欢迎使用文章源码进行转载;
  • 本博客采用 WPCMD 维护;
  • 本文标题:一个LuaSocket封装
  • 本文链接:http://zengrong.net/post/1980.htm

一个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库 一样。