• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

开源Lua网络库

武飞扬头像
51CTO
帮助0

 以前曾经写过一篇为lua添加网络功能的博客,当然那篇文章提提供的lua网络接口纯粹是实验玩玩的,没有任何实用性.今天突然又想起了这件事,想用前段时间写的KendyNet为lua提供一套网络接口.

这套接口是单线程的,通过PeekMsg获取网络事件,PeekMsg会在底层驱动epoll主循环.虽然也可以提供多线程的接口,在下面启动一个线程来驱动epoll,将事件提交到消息队列,由PeekMsg获取。但是,没人有会指望用lua写一个高性能的网络服务器,所以决定还是提供一个简单的接口,用来写写简单的小程序就可以了.

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

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

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

  1. echo.lua 
  2.  
  3. local registernet = assert(package.loadlib("./luanet.so","RegisterNet"))   
  4. registernet() 
  5. function mainloop() 
  6.     local netengine = CreateNet("127.0.0.1",8012) 
  7.     while true do 
  8.         local type,connection,rpacket = PeekMsg(netengine,50) 
  9.         if type then 
  10.             if type == 1 then 
  11.                 print("a connection comming"
  12.             elseif type == 3 then 
  13.                 local wpkt = CreateWpacket(rpacket,0)  
  14.                 SendPacket(connection,wpkt) 
  15.                 local msg = PacketReadString(rpacket) 
  16.                 print(msg) 
  17.                 ReleaseRpacket(rpacket) 
  18.             elseif type == 2 then 
  19.                 print("disconnect"
  20.                 CloseConnection(connection) 
  21.             else 
  22.             end 
  23.         end 
  24.          
  25.     end     
  26. end     
  27.  
  28. mainloop()   

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

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

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

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

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

原文链接:http://www.cnblogs.com/sniperHW/archive/2012/07/29/2614308.html

【编辑推荐】

  1. 编程语言新宠儿:Julia诞生记
  2. 当下主流JVM语言一览
  3. Lua开发工具脱离Eclipse 成为独立版本
  4. 菜鸟入门Java语言学习的要点
  5. 流行的编程语言之战

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /news/detail/tanhbkcjcg
系列文章
更多 icon
同类精品
更多 icon
继续加载