- 101
- 67
- Версия MoonLoader
- Другое
Приветствую. Мне нужно соединиться с сервером по веб сокету. Пробовал при помощи модуля websocket.lua, просит модуль lua-ev, который я просто не могу подгрузить, так как он в расширении .c. Для этого пробовал только кидать все в папку lib, но .c модули видимо не подгружает.
Также пробовал на ванилле писать, но чет не особо получилось. Ниже код, который я тестил. Но он не подключается к серверу и выводит в цикле "Socket is not connected" (status). Так как я только сегодня узнал об веб сокете, то не смог написать вменяемый код с нуля. Скорее всего нужно использовать модуль. Я просто хочу написать онлайн игру внутри гта.
Если использовать тот модуль от стороннего разработчика (websocket.lua), то придется пользователю догружать доп. модули. Но наверное это не особо проблематично. Что думаете, что посоветуете? Может кто-то уже имел дело с этим.
Также пробовал на ванилле писать, но чет не особо получилось. Ниже код, который я тестил. Но он не подключается к серверу и выводит в цикле "Socket is not connected" (status). Так как я только сегодня узнал об веб сокете, то не смог написать вменяемый код с нуля. Скорее всего нужно использовать модуль. Я просто хочу написать онлайн игру внутри гта.
Если использовать тот модуль от стороннего разработчика (websocket.lua), то придется пользователю догружать доп. модули. Но наверное это не особо проблематично. Что думаете, что посоветуете? Может кто-то уже имел дело с этим.
Lua:
local socket = require "socket"
local tcp = assert(socket.tcp())
function main()
if not isSampLoaded() or not isSampfuncsLoaded() then return end
while not isSampAvailable() do wait(100) end
tcp:connect('localhost/chat/server.php', 8090)
-- ws://localhost:8090/chat/server.php
-- ws://localhost/chat/server.php
-- localhost/chat/server.php
print("Connected!")
tcp:send(
"GET /chat"..
"Host: localhost"..
"Origin: https://localhost"..
"Connection: Upgrade"..
"Upgrade: websocket"..
"Sec-WebSocket-Key: "..generate_key()..
"Sec-WebSocket-Version: 13"
)
while true do
wait(0)
local s, status, partial = tcp:receive()
print(s or partial)
print(status)
if status == "closed" then break end
end
tcp:close()
end
function generate_key()
local r1 = math.random(0,0xfffffff)
local r2 = math.random(0,0xfffffff)
local r3 = math.random(0,0xfffffff)
local r4 = math.random(0,0xfffffff)
local key = write_int32(r1)..write_int32(r2)..write_int32(r3)..write_int32(r4)
assert(#key==16,#key)
return b64(key)
end
local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
function write_int32(v)
return string.char(
bit.band(bit.rshift(v, 24), 0xFF),
bit.band(bit.rshift(v, 16), 0xFF),
bit.band(bit.rshift(v, 8), 0xFF),
bit.band(v, 0xFF)
)
end
function b64(data)
return ((data:gsub('.', function(x)
local r, b = '',x:byte()
for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end
return r;
end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
if (#x < 6) then return '' end
local c=0
for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end
return b:sub(c+1,c+1)
end)..({ '', '==', '=' })[#data%3+1])
end