Исходник Гайд Использование неблокирующих WebSocket'ов в LUA

kyrtion

Известный
842
295
Серверный винда 2022 поставлена, x64.
При первом запуске выдает: %1 не является приложением Win32.
При повторном запуске раксампа: Не удается найти модуль.
раксамп сдохнут если там выйдет фатальная ошибка (ошибка в программе), и у его нет авто-запуск в случае краша/вылета
поэтому советую сменить ос на линукс и создать вайн под сборки вин10 и х64
 

Ejik_Letchik

Новичок
11
23
Какое-то время поработал с библиотекай, в целом всё классно, но есть несколько вещей которые можно было бы улучшить/прояснить:

1. Само соединение игру не блокирует, входящие пакеты принимает нормально, но вот при отправке пакетов игра всё же подвисает, насколько сильно зависит от пинга. Пробовал делать отправку отдельным потоком и всё-равно блокирует. Пример моего кода:

Если сервер не отвечает игру зафризит на время таймаута:
function sendOutput()
    lua_thread.create(function()
        local packetCounter = 0 --Костыль, для ограничения количества отправляемых пакетов
        local tables = findAllTables()
        for i = 1,  #tables do
            if packetCounter > settings.maincfg.maxPackets then packetCounter = 0 wait(5)
            else packetCounter = packetCounter + 1 end
            local result = {
                        tables[i].name,
                        tables[i].objType,
                    }
            if packetCounter > settings.maincfg.maxPackets then packetCounter = 0 wait(5)
            else packetCounter = packetCounter + 1 end
            WebS.SendMessage("OutputLua", result)--Чем выше пинг тем на дольше фризит игру
        end
    end)
end
на раксамп это особо не заметно, возможно особенности именно гташного мунлоадера.

2. Не умеет работать с https соединением. Во всяком случае если запускать тот же хост с сертификатом безопасности, то перестаёт к нему подключаться (именно со стороны игры/раксамп, на стороне сервера проблем нет). И эта часть наверное самая критичная, надеюсь что это я что-то не так делаю.

Соединение (gtasa):
function openConnection(hostURL)
    if (connectionStatus == 1) then return end
    attempsConnect = attempsConnect + 1
    attempsConnectTime = os.clock()
    print("{FFFF00}Opening connection to https://" .. hostURL)
 
    WebS.Connect("https://" .. hostURL .. "/samplua")
 
    isEnabled = true
    settings.maincfg.enableTransmit = true
    lua_thread.create(function()
        while true do
            local output = WebS.GetMessage()
            if output ~= '' then
                parseInputData(output)
            end
            wait(100)
        end
    end)
    print("{777777}Waiting for answer...")
    connectionStatus = 0
    sendUserConnect()
end
Соединение (raksamp):
function openConnection(hostURL)
    if (connectionStatus == 1) then return end
    attempsConnect = attempsConnect + 1
    attempsConnectTime = os.clock()
    print("{FFFF00}Opening connection to https://" .. hostURL)
 
    WebS.Connect("https://" .. hostURL .. "/samplua")
 
    isEnabled = true
    settings.maincfg.enableTransmit = true
    newTask(function()
        while true do
            local output = WebS.GetMessage()
            if output ~= '' then
                --print("{FFFF00}" .. output)
                parseInputData(output)
            end
            wait(100)
        end
    end)
    print("{777777}Waiting for answer...")
    connectionStatus = 0
    sendUserConnect()
end

3. Так и не понял возвращает ли WebS.Connect что-либо при успешном/неудачном подключении. Было бы неплохо чтобы возвращал.

4. При краше скрипта не всегда успевает сработать onExitScript(quitGame)/onScriptTerminate(s, quitGame), в результате из-за открытого соединения игра крашится
 
Последнее редактирование: