zoukankan      html  css  js  c++  java
  • 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("./luanet.so","RegisterNet"))  
    registernet()
    function mainloop()
        local netengine = CreateNet("127.0.0.1",8012)
        while true do
            local type,connection,rpacket = PeekMsg(netengine,50)
            if type then
                if type == 1 then
                    print("a connection comming")
                elseif type == 3 then
                    local wpkt = CreateWpacket(rpacket,0) 
                    SendPacket(connection,wpkt)
                    local msg = PacketReadString(rpacket)
                    print(msg)
                    ReleaseRpacket(rpacket)
                elseif type == 2 then
                    print("disconnect")
                    CloseConnection(connection)
                else
                end
            end
            
        end    
    end    
    
    mainloop()  
    复制代码

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

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

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

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

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

     
    分类: lua
  • 相关阅读:
    服务器实现跨域
    quartz定时任务cron表达式详解
    mysql分区/分片
    微信小程序 之三元运算符代替wx:if 来解决背景图片显示隐藏
    微信小程序 本地缓存保持登录状态之wx.setStorageSync()使用技巧
    微信小程序 赋值问题
    微信小程序 wx.navigateTo()传参及多个参数方法
    js 循环遍历数组
    VUE之Router命令行警告:Named Route 'Home' has a default child route. 解决办法
    VUE之命令行报错:Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead 解决办法
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2614557.html
Copyright © 2011-2022 走看看