一個(gè)開(kāi)源Lua網(wǎng)絡(luò)庫(kù)
以前曾經(jīng)寫(xiě)過(guò)一篇為lua添加網(wǎng)絡(luò)功能的博客,當(dāng)然那篇文章提提供的lua網(wǎng)絡(luò)接口純粹是實(shí)驗(yàn)玩玩的,沒(méi)有任何實(shí)用性.今天突然又想起了這件事,想用前段時(shí)間寫(xiě)的KendyNet為lua提供一套網(wǎng)絡(luò)接口.
這套接口是單線程的,通過(guò)PeekMsg獲取網(wǎng)絡(luò)事件,PeekMsg會(huì)在底層驅(qū)動(dòng)epoll主循環(huán).雖然也可以提供多線程的接口,在下面啟動(dòng)一個(gè)線程來(lái)驅(qū)動(dòng)epoll,將事件提交到消息隊(duì)列,由PeekMsg獲取。但是,沒(méi)人有會(huì)指望用lua寫(xiě)一個(gè)高性能的網(wǎng)絡(luò)服務(wù)器,所以決定還是提供一個(gè)簡(jiǎn)單的接口,用來(lái)寫(xiě)寫(xiě)簡(jiǎn)單的小程序就可以了.
首先介紹一下向lua提供的接口:
- lua_register(lState,"Connect",&luaConnect); //連接到遠(yuǎn)程服務(wù)器
- lua_register(lState,"CloseConnection",&luaCloseConnection); //銷(xiāo)毀連接
- lua_register(lState,"CreateNet",&luaCreateNet); //創(chuàng)建網(wǎng)絡(luò)接口
- lua_register(lState,"PeekMsg",&luaPeekMsg); //從消息隊(duì)列提取事件
- lua_register(lState,"CreateWpacket",&luaCreateWpacket); //創(chuàng)建一個(gè)寫(xiě)包
- lua_register(lState,"ReleaseRpacket",&luaReleaseRpacket); //釋放一個(gè)讀包
- lua_register(lState,"SendPacket",&luaSendPacket); //發(fā)送一個(gè)數(shù)據(jù)包
- lua_register(lState,"PacketReadString",&luaPacketReadString);//從數(shù)據(jù)包中讀取字符串
下面看一寫(xiě)用這套接口編寫(xiě)的echo服務(wù)器
- 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()
相當(dāng)簡(jiǎn)單,首先是導(dǎo)入luanet.so動(dòng)態(tài)庫(kù),并調(diào)用網(wǎng)絡(luò)接口注冊(cè)函數(shù),然后在127.0.0.1的8012端口上創(chuàng)建一個(gè)網(wǎng)絡(luò)引擎.
然后循環(huán)調(diào)用PeekMsg獲取事件即可.
目前還有些小bug需要解決.
項(xiàng)目地址:https://github.com/sniperHW/luanet
要注意的是本項(xiàng)目依賴于kendylib,所以下載時(shí)請(qǐng)把kendylib也一起下載.
原文鏈接:http://www.cnblogs.com/sniperHW/archive/2012/07/29/2614308.html
【編輯推薦】