1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/sniperHW-distri.lua

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

distri.lua

distri.lua — это фреймворк для разработки сетевых приложений на Lua, который помогает разработчикам быстро создавать онлайн-игровые серверы, веб-приложения, облегчённые распределённые системы и т. д.

Возможности включают:

  • быстрый цикл обработки событий;
  • поддержку TCP и UDP;
  • кооперативную библиотеку сокетов;
  • инфраструктуру RPC;
  • поддержку Linux и FreeBSD;
  • совместный запрос DNS;
  • облегчённый HttpServer;
  • SSL-соединение;
  • WebSocket;
  • локальную и удалённую отладку Lua;
  • интеграцию клиентского интерфейса Redis (синхронного и асинхронного).

distri.lua лицензирован под лицензией GPL.

Установка

  1. Установите libcurl.

  2. Установите Lua 5.2.

  3. Клонируйте репозиторий:

    • https://github.com/sniperHW/distri.lua.
  4. Опубликуйте отзывы и проблемы в системе отслеживания ошибок:

    • https://github.com/sniperHW/distri.lua/issues.
  5. Соберите проект:

    • В Ubuntu:

      • sudo apt-get install libssl-dev.
      • sudo apt-get install libreadline-dev.
      • Выполните команду make.
    • Во FreeBSD:

      • Выполните команду gmake.
  6. Запустите тесты:

  • Тест пинг-понг:

    • ./distrilua samples/hello.lua.
    • ./distrilua samples/pingclient.lua.
  • RPC-тест:

    • ./distrilua samples/rpcserver.lua.
    • ./distrilua samples/rpcclient.lua.
  1. Список задач:

    • Совместный запрос DNS.
    • WebSocket.
    • Отладчик.
  2. 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")
  1. UDP-тест:

Сервер:

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
  1. RPC-тест:

Сервер:

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 )

Вы можете оставить комментарий после Вход в систему

Введение

Распределённый фреймворк Lua. Расширить Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://gitlife.ru/oschina-mirror/sniperHW-distri.lua.git
git@gitlife.ru:oschina-mirror/sniperHW-distri.lua.git
oschina-mirror
sniperHW-distri.lua
sniperHW-distri.lua
master