chuck是一个单线程,异步的C网络库.同时导出了lua接口,能够经过lua方便的编写网络应用.
下面演示一下如何使用chuck编写一个简单的echo服务.html
echo.luamysql
local chuck = require("chuck") local socket = require("distri.socket") local engine = require("distri.engine") local signal = chuck.signal local signaler = signal.signaler(signal.SIGINT) local clone = chuck.packet local server = socket.stream.listen("127.0.0.1",8010,function (s,errno) if s then if s:Ok(4096,socket.stream.rawdecoder,function (_,msg,errno) if msg then s:Send(clone(msg)) else s:Close() s = nil end end) then s:SetRecvTimeout(5000) end end end) if server then signaler:Register(engine,function () engine:Stop() end) chuck.RegTimer(engine,1000,function() collectgarbage("collect") end) engine:Run() end
在命令行下输入./lua echo.lua,而后经过telnet链接服务器便可.git
chuck提供了面向事件回调的接口,接下来将会使用lua coroutine中对基本的chuck接口进行封装,实现一个同步网络应用开发框架.github
下面再看一个http server的示例.sql
http.lua服务器
local chuck = require("chuck") local Http = require("samples.lua.http.http") local signaler = chuck.signal.signaler(chuck.signal.SIGINT) signaler:Register(Http.engine,function () print("recv sigint") Http.Stop() end) local server = Http.HttpServer(function (req,res) res:WriteHead(200,"OK", {"Content-Type: text/plain"}) res:End("hello world!") end):Listen("127.0.0.1",8010) if server then Http.Run() end
我最终但愿将chuck变成一个能够使用lua来编写的应用服务器框架,下面是结合使用luasql生成动态页面的示例.网络
mysql.html框架
<!DOCTYPE html><!--STATUS OK--> <html> <head> </head> <?lua local str = [[ <table border="1">]] local driver = require "luasql.mysql" env = driver.mysql() conn = env:connect("ias_test","root","802802","127.0.0.1",3306) conn:execute"SET NAMES GB2312" cur = conn:execute("select id,UserName from user limit 20") row = cur:fetch("a") str = str .. [[ <tr> <td>id</td> <td>name</td> </tr>]] while row do str = str .. "<tr><td>" .. row.id .. "</td><td>" .. row.UserName .. "</td></tr>" row = cur:fetch("a") end str = str .. "</table> " conn:close() env:close() return str /?lua> </html>
这个html文件中经过使用<?lua>
标签嵌入了一段lua脚本,当请求这个页面的时候,内嵌的lua脚本将会被执行以生成输出页面.异步
为了让这个html中的lua脚本得以正确执行,http.lua将被调整成以下形式:socket
local chuck = require("chuck") local Http = require("samples.lua.http.http") local signaler = chuck.signal.signaler(chuck.signal.SIGINT) local Template = require("samples.lua.http.Template") signaler:Register(Http.engine,function () print("recv sigint") Http.Stop() end) --dynamic page local server = Http.HttpServer(function (req,res) res:WriteHead(200,"OK", {"Content-Type: text/html"}) res:End(Template.Load("samples/lua/http/index.html")) end):Listen("127.0.0.1",8010) if server then Http.Run() end
chuck目前正在开发中,欢迎你们提出宝贵的意见.