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
  • Лёгкий HTTP-сервер
  • Подключение SSL
  • WebSocket
  • Локальная и удалённая отладка Lua
  • Интеграция клиентского интерфейса Redis (синхронный и асинхронный)

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

Установка distri.lua

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

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

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

Отправьте обратную связь и сообщите о проблемах на трекере ошибок.

Сборка

в Ubuntu

sudo apt-get install libssl-dev
sudo apt-get install libreadline-dev

make

в FreeBSD

gmake

Запуск тестов

тест pingpong

./distrilua samples/hello.lua
./distrilua samples/pingclient.lua

тест rpc

./distrilua samples/rpcserver.lua
./distrilua samples/rpcclient.lua

Список задач

  • Кооперативный запрос DNS
  • WebSocket
  • Отладчик

HTTP-тест

local http = require "lua.http"
http.createServer(function(req, res)
	res.writeHead(200, "OK", {["Content-Type"] = "text/plain"})
	res.end("Привет, мир\n")
end):listen("127.0.0.1", 8001)

print("Сервер создан на 127.0.0.1 8001")

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

Тест 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("новый клиент")
            rpcserver:Add(client:Establish(Socket.Stream.RDecoder()))
    end)


    if success then
        print("сервер запущен на 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("ошибка при запуске сервера")
    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("соединение с 127.0.0.1:8000 завершено успешно")
                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: " .. 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("здесь")
        if toredis then
            print("соединение с Redis прервано")
        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("попытка соединения через 1 секунду")
                Sche.Sleep(1000)
            end
        end)
    end

Подключение к Redis

Пока toredis не установлен
    Sche.Yield()

local err, result = toredis:CommandSync("hmget test nickname")

Если result существует
    Для каждого k, v в result
        Выведите k, v
    Конец
Конец

Пример онлайн игры

См. Survive

Комментарии ( 0 )

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

Введение

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

Обновления

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

Участники

все

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

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