distri.lua
distri.lua — это фреймворк для разработки сетевых приложений на Lua, который помогает разработчикам быстро создавать онлайн-игровые серверы, веб-приложения, облегчённые распределённые системы и т. д.
Возможности включают:
distri.lua лицензирован под лицензией GPL.
Установка
Установите libcurl.
Установите Lua 5.2.
Клонируйте репозиторий:
https://github.com/sniperHW/distri.lua
.Опубликуйте отзывы и проблемы в системе отслеживания ошибок:
https://github.com/sniperHW/distri.lua/issues
.Соберите проект:
В Ubuntu:
sudo apt-get install libssl-dev
.sudo apt-get install libreadline-dev
.make
.Во FreeBSD:
gmake
.Запустите тесты:
Тест пинг-понг:
./distrilua samples/hello.lua
../distrilua samples/pingclient.lua
.RPC-тест:
./distrilua samples/rpcserver.lua
../distrilua samples/rpcclient.lua
.Список задач:
HTTP-тест:
local Http = require "lua/http"
Http.CreateServer(function (req, res)
res:WriteHead(200,"OK", {"Content-Type: text/plain"})
res:End("Hello World\n");
end):Listen("127.0.0.1",8001)
print("create server on 127.0.0.1 8001")
Сервер:
local Socket = require "lua.socket"
local Timer = require "lua.timer"
local Sche = require "lua.sche"
local count = 0
local s = Socket.Datagram.New(CSocket.AF_INET,1024,Socket.Datagram.RDecoder())
s:Listen("127.0.0.1",8010)
Sche.Spawn(function ()
while true do
local rpk,from = s:Recv()
--print(from[1],from[2],from[3])
count = count + 1
s:Send(Socket.WPacket(rpk),from)
end
end)
local last = C.GetSysTick()
local timer = Timer.New():Register(function ()
local now = C.GetSysTick()
print(string.format("count:%d",count*1000/(now-last)))
count = 0
last = now
end,1000):Run()
Клиент:
local Socket = require "lua.socket"
local s = Socket.Datagram.New(CSocket.AF_INET,1024,Socket.Datagram.RDecoder())
for i = 1,3 do
local wpk = Socket.WPacket(1024)
wpk:Write_string("hello")
s:Send(wpk,{CSocket.AF_INET,"127.0.0.1",8010})
end
while true do
local rpk,from = s:Recv()
s:Send(Socket.WPacket(rpk),from)
end
Сервер:
local TcpServer = require "lua.tcpserver"
local App = require "lua.application"
local RPC = require "lua.rpc"
local Timer = require "lua.timer"
local Sche = require "lua.sche"
local Socket = require "lua.socket"
local count = 0
local rpcserver = App.New()
rpcserver:RPCService("Plus",function (_,a,b)
count = count + 1
return a+b
end)
local success
local success = not TcpServer.Listen("127.0.0.1",8000,function (client)
print("on new client")
rpcserver:Add(client:Establish(Socket.Stream.RDecoder()))
end)
if success then
print("server start on 127.0.0.1:8000")
local last = C.GetSysTick()
local timer = Timer.New():Register(function ()
local now = C.GetSysTick()
print(string.format("cocount:%d,rpccount:%d,elapse:%d",
Sche.GetCoCount(),count*1000/(now-last),now-last))
count = 0
last = now
end,1000):Run()
else
print("server start error")
end
Клиент:
local Socket = require "lua.socket"
local App = require "lua.application"
local RPC = require "lua.rpc"
local Sche = require "lua.sche"
local rpcclient = App.New()
for i=1,10 do
Sche.Spawn(function ()
local client = Socket.Stream.New(CSocket.AF_INET)
if client:Connect("127.0.0.1",8000) then
print("connect")
else
print("connection error")
end
end)
end
``` ```
to 127.0.0.1:8000 error")
return
end
rpcclient:Add(client:Establish(Socket.Stream.RDecoder()),nil,on_disconnected)
local rpcHandler = RPC.MakeRPC(client,"Plus")
for j=1,100 do
Sche.Spawn(function (client)
while true do
local err,ret = rpcHandler:Call(1,2)
if err then
print("rpc error:" .. err)
client:Close()
return
end
end
end,client)
end
end)
end
Тест клиента Redis
local Redis = require "lua.redis"
local Sche = require "lua.sche"
local Timer = require "lua.timer"
local count = 0
local toredis
local function connect_to_redis()
print("here")
if toredis then
print("to redis disconnected")
end
toredis = nil
Sche.Spawn(function ()
while true do
local err
err,toredis = Redis.Connect("127.0.0.1",6379,connect_to_redis)
if toredis then
break
end
print("try to connect after 1 sec")
Sche.Sleep(1000)
end
end)
end
connect_to_redis()
while not toredis do
Sche.Yield()
end
local err,result = toredis:CommandSync("hmget test nickname")
if result then
for k,v in pairs(result) do
print(k,v)
end
end
Демонстрация онлайн-игры
См. Survive на GitHub.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )