quick-cocos2d-x 中的 socket 技术选择:LuaSocket 和 WebSocket
来源:互联网 发布:java agent premain 编辑:程序博客网 时间:2024/06/06 01:51
- 本站文章除注明转载外,均为本站原创或者翻译。
- 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商;
- 本站部分原创和翻译文章提供markdown格式源码,欢迎使用文章源码进行转载;
- 本博客采用 WPCMD 维护;
- 本文标题:quick-cocos2d-x 中的 socket 技术选择:LuaSocket 和 WebSocket
- 本文链接:http://zengrong.net/post/1965.htm
quick-cocos2d-x 中的 socket 技术选择:LuaSocket 和 WebSocket
- 2013-11-17更新:加入SocketTCP和ByteArray类的实现链接。
- 2014-11-05更新:增加范例链接。
- 2014-12-04更新:一篇更详细的文章: Socket 与 WebSocket 。
在 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 版本。
二、易用性
[quick]/samples/websockets
是quick提供的一个WebSocket范例。 [quick]/samples/cocos2dx_luatest/scripts/ExtensionTest/WebProxyTest.lua
也是一个范例。WebSocket 库封装了一些基本的事件支持 open/message/close/error ,在使用的时候比较方便。
WebSocket 天生就是非阻塞的。
在 quick 中,并没有提供 LuaSocket 的范例。 我为 luasocket 写了一个 sample ,已经提交给了 quick 。
LuaSocket 项目本身页提供了 不少范例 和 库 。从 ftp 到 socket 服务器实现,应有尽有了。
LuaSocket 并没有封装事件支持。不过我们完全可以自己来封装。LuaSocket 支持阻塞和非阻塞的方式获取数据。
我在 一个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 ,但其实我们完全可以用 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(s,"(.)",function (x) return string.format("%02d ",string.byte(x)) end)print(__s)
如果不使用C模块,这里也有几个完全使用lua实现的位运算库。速度会比C慢:12 3
我基于 lpack 封装了一个 ByteArray 类,用来模仿 Actionscript 中 flash.utils.ByteArray 的行为。详情可以看这里: 用lua实现ByteArray 。
在我的 luasocket sample 中,我还提供了PacketBuffer 来负责数据解析以及粘包处理,可以参考。
七、服务器实现
服务端的选择就更广泛了。C/C++/JAVA/Go/Node.js/Python 等主流语言都有 WebSocket 的开源实现。标准的 TCP Socket 就更不用说了,那个是网络基础好吧。
但是,WebSocket 和 标准Socket 服务器的实现,还是有区别的。主要的问题在于WebSocket的 握手 和 数据帧 方式与标准Socket不同。
由于我们的服务端已经采用标准Socket实现,再转向 WebSocket 就有点多此一举。所以我这个客户端就苦B一点把,把 LuaSocket 封装一下直接用了。
- quick-cocos2d-x 中的 socket 技术选择:LuaSocket 和 WebSocket
- quick-cocos2d-x 中的 socket 技术选择:LuaSocket 和 WebSocket
- quick-cocos2d-x 中的 socket 技术选择:LuaSocket 和 WebSocket
- quick-cocos2d-x和cocos2d-x
- 我为什么应该选择 quick-cocos2d-x?
- 我为什么应该选择 quick-cocos2d-x?
- 我为什么应该选择 quick-cocos2d-x?
- quick-cocos2d-x 学习系列之十二 关于websocket
- quick-cocos2d-x中的ListView详解
- Quick-Cocos2d-x中的绘图API
- quick-cocos2d-x中的ListView详解
- [寒江孤叶丶的Cocos2d-x之旅_14]Cocos2d-x 3.2版本以上LUA脚本Socket通讯解决方案——LuaSocket
- cocos2d-x 3.1中luasocket试用
- quick-cocos2d-x 脚本和资源加密
- 【quick-cocos2d-x】动画和粒子
- quick-cocos2d-x 脚本和资源加密
- Quick-cocos2d-x 环境搭建及工具选择
- quick cocos2d-x
- jquery获取表单对象,且解决乱码问题
- 安卓 PC IOS客户端图片上传
- ruby on rails常见的服务器
- Android Volley解析(二)之表单提交篇
- tomcat-users.xml文件配置
- quick-cocos2d-x 中的 socket 技术选择:LuaSocket 和 WebSocket
- 线程常用接口
- java分布式通信系统(J2EE分布式服务器架构)
- 浅析return false的正确使用
- JDBC编程之事务处理
- Command /usr/bin/codesign failed with exit code 1
- 正则表达式快速入门(python示例)
- 电视信号——行场同步
- C++指针函数与函数指针