开源一个lua的网络库

开源一个lua的网络库

以前曾经写过一篇为lua添加网络功能的博客,当然那篇文章提提供的lua网络接口纯粹是实验玩玩的,香港服务器,没有任何实用性.

今天突然又想起了这件事,想用前段时间写的KendyNet为lua提供一套网络接口.

这套接口是单线程的,通过PeekMsg获取网络事件,PeekMsg会在底层驱动epoll主循环.虽然也可以提供多线程的接口,

在下面启动一个线程来驱动epoll,将事件提交到消息队列,由PeekMsg获取。但是,没人有会指望用lua写一个高性能的

网络服务器,服务器空间,所以决定还是提供一个简单的接口,用来写写简单的小程序就可以了.

首先介绍一下向lua提供的接口:

lua_register(lState,”Connect”,&luaConnect); //连接到远程服务器 lua_register(lState,”CloseConnection”,&luaCloseConnection); //销毁连接 lua_register(lState,”CreateNet”,&luaCreateNet); //创建网络接口 lua_register(lState,”PeekMsg”,&luaPeekMsg); //从消息队列提取事件 lua_register(lState,”CreateWpacket”,&luaCreateWpacket); //创建一个写包 lua_register(lState,”ReleaseRpacket”,&luaReleaseRpacket); //释放一个读包 lua_register(lState,”SendPacket”,&luaSendPacket); //发送一个数据包 lua_register(lState,”PacketReadString”,&luaPacketReadString);//从数据包中读取字符串

下面看一写用这套接口编写的echo服务器

echo.lua

local registernet = assert(package.loadlib(,)) registernet()function mainloop()local netengine = CreateNet(,8012)local type,connection,rpacket = PeekMsg(netengine,50)if type thenif type == 1 thenprint()elseif type == 3 thenlocal wpkt = CreateWpacket(rpacket,0)SendPacket(connection,wpkt)local msg = PacketReadString(rpacket)print(msg)ReleaseRpacket(rpacket)elseif type == 2 thenprint()CloseConnection(connection)elseendendendendmainloop()

相当简单,首先是导入luanet.so动态库,并调用网络接口注册函数,然后在127.0.0.1的8012端口上创建一个网络引擎.

然后循环调用PeekMsg获取事件即可.

目前还有些小bug需要解决.

项目地址:https://github.com/sniperHW/luanet

要注意的是本项目依赖于kendylib,所以下载时请把kendylib也一起下载.

测试下来性能还算满意,在我的 i5 双核 2.53G的笔记本上,建立200个连接,每秒发送17个包,服务器收到后转发给所有200个连接

转发包得数量在52W左右,平均延时在70-100之间,服务器CPU占用在不到单核心的50%.

posted on

,服务器空间最快乐的时候,就是去旅行。

开源一个lua的网络库

相关文章:

你感兴趣的文章:

标签云: