Snusmumriken
Когда мне нужна либа, я беру первую попавшуюся, и всеми правдами и неправдами стараюсь её завести. Не завелась? Добываем другую версию, пишем биндинг ручками, подгребаем ffi и так далее. Потому что мне нужно решить задачу, а не развлекаться версиями.
Нет, курл не поддерживает вебсокеты по умолчанию (только с адовыми извращениями и не полностью). Где ты про это прочитал?
Anatoliy
Snusmumriken
Через либу, которая поддерживает вебсокеты.
Можешь написать на luasocket (luasec), это не так уж сложно.
У тебя есть TCP-соединение и документация о протоколе в гугле, этого достаточно.
Anatoliy
Snusmumriken
Нет. Ты знаешь что такое http?
Anatoliy
Гипер текст трансфер протокол )
Snusmumriken
Технически, правильно. Но не то что я хотел.
Как работает хттп-сервер и хттп-клиент вкратце?
Советую взять гугл и тщательно разобрать каждый вопрос, ответ на который тебе не понятен.
Snusmumriken
Если ты собрался чем-то таким заниматься, тебе придётся это досконально изучить. И модель OSI (TCP/IP), и то как работают протоколы, и кто что из них делает и так далее.
Как работает вебсокет? Что это такое? Зачем вообще его изобретали?
Anatoliy
Ок почитаю потом буду дальше спрашивать
Snusmumriken
Ну прост если нахвататься информации с поверхности, при появлении хоть чего-то нового, не совсем стандартного или того что ты всё ещё не изучил, у тебя будет вылезать ступор, или адовые баги которые ты не знаешь как решить (и даже не знаешь какой вопрос задать гуглу чтобы тот ответил) и т.п. Перед сном можешь взять книжку "Компьютерные сети" от Олифера и Олифера. Книжка для лёгкого чтения, зубрить её не нужно, по крайней мере будешь более-менее понимать что происходит под капотом.
Snusmumriken
Карочи, уточнение: Диего Нехаб не писал поддержку вебсокетов в своём луасокете. Вебсокеты — это http-соединение, которое волшебным образом (через указание заголовков при запросе) превращается в постоянное, полностью меняя протокол с http на вебсокетный.
Фактически, что происходит. Браузер такой: "сервер, давай текущее соединение по которому я тебе пишу сделаем вебсокетным!", а сервер такой: "а давай". И всё, теперь они общаются по вебсокету.
Из аналогий в реальной жизни, это можно представить как "эй, сервер, чот английский язык недостаточно выразителен, давай перейдём на урдмутский". Сам протокол представления данных и организации приёма-передачи полностью меняется.
Ну конечно, можно не апгрейдить хттп до вебсокета а с самого начала подключаться, так уже даже начали довольно часто делать, правда непонятно зачем.
vvzvlad
Вот он, аналог смены протокола
Pavel
ребят а в ngx lua module как вы строите работу с request ?
делаете свою табличку request в которую все кладете, и дальше процессите ее между всеми функциями\модулями ?
или каждый модуль сам процессит ngx.req что может привести к некоторому оверхеду
Pavel
Snusmumriken
При ошибках самого запроса.
Snusmumriken
Ну там, в query/json-запросе клиент указал поле, или оно имеет неправильное значение, или пользователь не имеет прав ещё что-то.
Кстати, pcall — довольно специфическая штука, она не даёт трейсбеков. Чтобы видеть нормальную, полную ошибку — дёргай
local succ, full_err = xpcall(func, debug.traceback)
Эта фигня прикручивает к ошибке нормальный стактрейс, такой же как ты видишь при обычных падениях скрипта.
Pavel
норм. спасибо.
> в query/json-запросе не указали поле
если ошибка на уровне логики, то это ведь задача process
а вот ошибка общего уровня, к примеру невалидный json, обрабатывается в момент parse
собственно это не противоречит тебе.
Pavel
Эээх…..еще бы статический анализ притащить….
Snusmumriken
Ну, по мне, parse не должно делать ничего кроме парсинга. То есть, фактически, группирует ключи-значения из query (если есть) и из body (если есть) в одной табличке.
Pavel
да. но если он не может вычитать json? он не валиден? или вообще дичь пришла, то почему ы ему и не упасть...
Anatoliy
Ребята всем привет подскажите в чем может быть проблема, пытаюсь работать с вебсокетами, как клиент, делаю все по инструкции вот отсюда https://github.com/lipp/lua-websockets/blob/master/API.md
Anatoliy
Вот код local copas = require'copas'
local websocket = require'websocket'
local client = websocket.client.copas({timeout=2})
local message,opcode,close_was_clean,close_code,close_reason = client:receive()
local ok,err = client:connect('wss://.....','echo')
if not ok then
print('could not connect',err)
end
local message,opcode = client:receive()
if message then
print('msg',message,opcode)
else
print('connection closed')
end
Anatoliy
В иотге при попытке коннекта все время отваливается с ошибкой - could not connect Operation already in progress
connection closed
Anatoliy
пробовал разные ресурсы wss:// - результат одинаковый
Mikhail
Хз. Пробовал пример кода для этой библиотеки . Все работает. Ubuntu 16.
Artem
Вот код local copas = require'copas'
local websocket = require'websocket'
local client = websocket.client.copas({timeout=2})
local message,opcode,close_was_clean,close_code,close_reason = client:receive()
local ok,err = client:connect('wss://.....','echo')
if not ok then
print('could not connect',err)
end
local message,opcode = client:receive()
if message then
print('msg',message,opcode)
else
print('connection closed')
end
Могу сегодня позже дать рабочий пример с websocket
Artem
У меня используется для оповещений в интерфейсе
Mikhail
Интересует вебсокет под винду
Mikhail
В отсутствии бинариков под винду. Я перешёл под линукс и решил все проблемы.
Artem
Saphire
Mikhail
Библиотеки на луа кросс платформа. А вот им необходимые компоненты не всегда.
Mikhail
Artem
Я могу конечно ошибаться, но так как вебсокеты - это просто протокол, то по идее должно все работать через стандартную сетевую библиотеку, а та в свою очередь вроде как точно под виндой должна работать
Saphire
Artem
HTTP - это тоже протокол, а вот траспорт осущевствляет сокетная библиотека
Anatoliy
Anonymous
😂😂😂
Artem
local ev = require'ev'
json = require'cjson'
users = {}
local client = function(ws)
local id = false
ws:on_message(function(ws,message)
if not id then
id = message
end
if not users[id] then
users[id] = {}
end
table.insert(users[id], ws);
end)
ws:on_close(function()
for i, sock in pairs(users[id]) do
if sock == ws then
users[id][i] = nil
end
end
ws:close()
end)
end
local server = function (ws)
ws:on_message(function(ws,message)
local data = json.decode(message);
if users[data.id] then
for _, user_sock in pairs(users[data.id]) do
user_sock:send(message)
end
end
end)
ws:on_close(function()
ws:close()
end)
end
local server = require'websocket'.server.ev.listen {
port = "8080",
default = client,
protocols = {
client = client,
server = server
}
}
ev.Loop.default:loop()
vitaly
добрый день товарищи со-луавцы
vitaly
я давно вас не радовал вниманием
Anatoliy
local ev = require'ev'
json = require'cjson'
users = {}
local client = function(ws)
local id = false
ws:on_message(function(ws,message)
if not id then
id = message
end
if not users[id] then
users[id] = {}
end
table.insert(users[id], ws);
end)
ws:on_close(function()
for i, sock in pairs(users[id]) do
if sock == ws then
users[id][i] = nil
end
end
ws:close()
end)
end
local server = function (ws)
ws:on_message(function(ws,message)
local data = json.decode(message);
if users[data.id] then
for _, user_sock in pairs(users[data.id]) do
user_sock:send(message)
end
end
end)
ws:on_close(function()
ws:close()
end)
end
local server = require'websocket'.server.ev.listen {
port = "8080",
default = client,
protocols = {
client = client,
server = server
}
}
ev.Loop.default:loop()
Я уже и это пробовал, только вот где библиотечку ev.dll взять? Я уже обыскался, нашёл исходники но замучался их в винде компилить
Anonymous
Это libev чтоли?
Anonymous
Из виндового дистрибутива nodejs можешь спиздить , наверное
Tverd
в ноде разве не libuv ?
vitaly
а про порно было что нить?
Snusmumriken
(нет)
Anatoliy
local ev = require'ev'
json = require'cjson'
users = {}
local client = function(ws)
local id = false
ws:on_message(function(ws,message)
if not id then
id = message
end
if not users[id] then
users[id] = {}
end
table.insert(users[id], ws);
end)
ws:on_close(function()
for i, sock in pairs(users[id]) do
if sock == ws then
users[id][i] = nil
end
end
ws:close()
end)
end
local server = function (ws)
ws:on_message(function(ws,message)
local data = json.decode(message);
if users[data.id] then
for _, user_sock in pairs(users[data.id]) do
user_sock:send(message)
end
end
end)
ws:on_close(function()
ws:close()
end)
end
local server = require'websocket'.server.ev.listen {
port = "8080",
default = client,
protocols = {
client = client,
server = server
}
}
ev.Loop.default:loop()
а я понял - require 'ev' это не ev.dll, это ev.lua, видимо переименованный client_ev.lua но в итоге у меня все время ошибка - \lua\websocket\client_ev.lua:14: attempt to index a function value (local 'ev')
stack traceback:
\lua\websocket\client_ev.lua:14: in function 'websocket.client_ev'
echo-client-ev.lua:4: in main chunk
Snusmumriken
А что эта ошибка означает? : )
Andrey
Можете обьяснить для начинающего что это и что оно делает и почему внутри нет self
И правильно ли это или нет ?
ws:on_close(function()
for i, sock in pairs(users[id]) do
if sock == ws then
users[id][i] = nil
end
end
ws:close()
end)
end
Andrey
это вызов или обработка вызова ?
Snusmumriken
Потому что в функцию не передаётся self.
Snusmumriken
Это запись колбека.
Andrey
а двоеточие тогда зачем
Snusmumriken
Потому что указание колбека — метод объекта.
Snusmumriken
Раздели на функцию и запихивание её, станет чуть понятнее.
local function cls()
for i, sock in pairs(users[id]) do
if sock == ws then
users[id][i] = nil
end
end
ws:close()
end
ws:on_close(cls)
Хотя обычно, у колбеков есть аргументы, например
local function cls(self).
Andrey
а более по русски. ? :) есть массив ws
Snusmumriken
Ты знаешь что такое двоеточие, и для чего может понадобиться?
Andrey
для селфа
Andrey
сахар, знаю
Andrey
но тут его нет
Andrey
и даже знаю что такое вебсокет
Andrey
но не пойму
Snusmumriken
Ну например смотри.
local Class = {}
function Class:setCallback(func)
self.callback = func
end
function Class:call_callback()
self.callback(self)
end
local function bar(v) print(v) end
Class:setCallback(bar)
print(Class.callback(10, 20)) --> 10
Class:call_callback() —> table 0x123124 (таблица Class)
Snusmumriken
Остальное зависит от реализации библиотеки
Snusmumriken
Если бы твоя фиговина вызывает функцию с self — можно использовать self.
ws:on_close(function(self) --< ВОТ ТУТ
for i, sock in pairs(users[id]) do
if sock == ws then
users[id][i] = nil
end
end
self:close() --< А ТУТ ИСПОЛЬЗУЕМ
end)
end
Andrey
Пока не очень понятно. Там где двоеточие должно передаваться self но в коде оно не испльзуется. Завтра попробую на свежую голову понять
Andrey
Andrey
это я знаю
Snusmumriken
Карочи, давай я напишу тебе без self.
ws.on_close(ws, function()
...
ws:close()
end)
Andrey
а двоеточие тогда - ради чего, ради синтаксиса ?
Snusmumriken
Да. Это исключительно другая форма записи того же самого.
Andrey
понял. т.е. что бы было универсально
Snusmumriken
object = {x = 10, y = 20}
function object.foo(obj)
return obj.x + obj.y
end
function object:bar()
return self.x - self.y
end
print(object:foo()) --> 30
print(object.bar(object)) --> -10
Andrey
а чем будет отличаться например
function object:bar()
return object.x- object.y
end
Andrey
ну как пример - там просто вместо self по коду ws