Исходник Гайд SNET - Networking Interface

ImPasha

Software Developer & System Administrator
Автор темы
Друг
1,788
2,141
Если это массив, то можно перебрать вручную все элементы и засунуть в бс, если это ассоциативный массив, то запихнуть можно так же, а вот вытащить данные не получится — ассоциативный массив не гарантирует порядок элементов
Можно попробовать передачу ключей от ассоциативного массива перед значением, но, конечно же, от этого размер пакета сильно возрастет, что не есть хорошо. Рекомендуется передавать минимальное количество данных, ибо размер пакета для передачи ограничен.
 

ImPasha

Software Developer & System Administrator
Автор темы
Друг
1,788
2,141
Вот пример того, как можно перевести одномерный не ассоциативный массив в BStream и обратно. Код не проверял, может не работать.
Код можно сильно улучшить, в этом же примере, как можно заметить, используются типы данных, которые занимают огромное количество места. Лучше выбирать тип данных в зависимости от значения переменной, а вообще лучше не переводить таблицы в BStream, а делать всё вручную.

Lua:
local function table_to_bstream(bs, t)
    local elements = 0
    for i, v in ipairs(t) do
        if type(v) == 'string' then
            bs:write(BS_UINT8, 1)
      bs:write(BS_UINT32, #v)
      bs:write(BS_STRING, v)
      elements = elements + 1
    else type(v) == 'number' then
      if v % 1 == 0 then
        bs:write(BS_UINT8, 2)
        bs:write(BS_INT32, v)
      else
        bs:write(BS_UINT8, 3)
        bs:write(BS_FLOAT, v)
      end
      elements = elements + 1
    else type(v) == 'boolean' then
      bs:write(BS_UINT8, 4)
      bs:write(BS_BOOLEAN, v)
      elements = elements + 1
    end
  end
  bs.write_ptr = 1
  bs:write(BS_UINT8, elements)
    bs.write_ptr = #bs.bytes + 1
end

local function bstream_to_table(bs, t)
  for i = 1, bs:read(BS_UINT8) do
        local val_type = bs:read(BS_UINT8)
        if val_type == 1 then
            table.insert(t, bs:read(BS_STRING, bs:read(BS_UINT32)))
        elseif val_type == 2 then
            table.insert(t, bs:read(BS_INT32))
        elseif val_type == 3 then
            table.insert(t, bs:read(BS_FLOAT))
        elseif val_type == 4 then
            table.insert(t, bs:read(BS_BOOLEAN))
        end
  end
end

local t = {1, 2, 3, 4.32, 5, "string", true}
local bs = snet.bstream.new()

table_to_bstream(bs, t)

local new_t = {}
bstream_to_table(bs, new_t)

-- RESULT: new_t = {1, 2, 3, 4.32, 5, "string", true}
 
  • Нравится
Реакции: Vespan

user337567

Участник
91
10
Вот пример того, как можно перевести одномерный не ассоциативный массив в BStream и обратно. Код не проверял, может не работать.
Код можно сильно улучшить, в этом же примере, как можно заметить, используются типы данных, которые занимают огромное количество места. Лучше выбирать тип данных в зависимости от значения переменной, а вообще лучше не переводить таблицы в BStream, а делать всё вручную.
Lua:
local function table_to_bstream(bs, t)
    local elements = 0
    for i, v in ipairs(t) do
        if type(v) == 'string' then
            bs:write(BS_UINT8, 1)
      bs:write(BS_UINT32, #v)
      bs:write(BS_STRING, v)
      elements = elements + 1
    else type(v) == 'number' then
      if v % 1 == 0 then
        bs:write(BS_UINT8, 2)
        bs:write(BS_INT32, v)
      else
        bs:write(BS_UINT8, 3)
        bs:write(BS_FLOAT, v)
      end
      elements = elements + 1
    else type(v) == 'boolean' then
      bs:write(BS_UINT8, 4)
      bs:write(BS_BOOLEAN, v)
      elements = elements + 1
    end
  end
  bs.write_ptr = 1
  bs:write(BS_UINT8, elements)
    bs.write_ptr = #bs.bytes + 1
end

local function bstream_to_table(bs, t)
  for i = 1, bs:read(BS_UINT8) do
        local val_type = bs:read(BS_UINT8)
        if val_type == 1 then
            table.insert(t, bs:read(BS_STRING, bs:read(BS_UINT32)))
        elseif val_type == 2 then
            table.insert(t, bs:read(BS_INT32))
        elseif val_type == 3 then
            table.insert(t, bs:read(BS_FLOAT))
        elseif val_type == 4 then
            table.insert(t, bs:read(BS_BOOLEAN))
        end
  end
end

local t = {1, 2, 3, 4.32, 5, "string", true}
local bs = snet.bstream.new()

table_to_bstream(bs, t)

local new_t = {}
bstream_to_table(bs, new_t)

-- RESULT: new_t = {1, 2, 3, 4.32, 5, "string", true}
я думаю, можно преобразовать таблицу в строку и потом преобразовать обратно в таблицу с помощью load(), для решения проблемы с размером пакета можно передавать частями
 

ImPasha

Software Developer & System Administrator
Автор темы
Друг
1,788
2,141
как на хост залить чтобы работало?
Нужен хостинг с SSH-доступом и возможностью установить последнюю версию LuaJIT.
Запуск производится при помощи команды в SSH терминале:
Bash:
luajit scriptname.lua
 

ImPasha

Software Developer & System Administrator
Автор темы
Друг
1,788
2,141
Как в server.lua сделать задержку ?
Если ты хочешь запихнуть сервер в MoonLoader скрипт, то знайте, что я вам запрещаю это делать.

25e4a228a4c39b02d672a9c211426f3e.jpg
 

kxdxlxv

Новичок
1
0
Жаль нет четкой документации по структуре пакетов, можно было бы забацать Python порт либы.
А еще не помешало бы добавить поддержку прокси на стороне клиента. Ну и работу через тор прикрутить))
 

Ya Zaregalsya

Известный
387
135
Либа полезная, но документация и примеры ниже плинтуса, поменял все названия, в примере оставил старые, это чё за бред? Пока не напишешь нормальную документацию, проектов на этой либе можно будет на пальцах посчитать. Ну и что там по C++? Сначала добавил модуль, потом удалил.
 
Последнее редактирование: