Snusmumriken
Когда мне нужна либа, я беру первую попавшуюся, и всеми правдами и неправдами стараюсь её завести. Не завелась? Добываем другую версию, пишем биндинг ручками, подгребаем ffi и так далее. Потому что мне нужно решить задачу, а не развлекаться версиями. Нет, курл не поддерживает вебсокеты по умолчанию (только с адовыми извращениями и не полностью). Где ты про это прочитал?
Snusmumriken
Через либу, которая поддерживает вебсокеты. Можешь написать на luasocket (luasec), это не так уж сложно. У тебя есть TCP-соединение и документация о протоколе в гугле, этого достаточно.
Snusmumriken
Нет. Ты знаешь что такое http?
Anatoliy
Гипер текст трансфер протокол )
Snusmumriken
Технически, правильно. Но не то что я хотел. Как работает хттп-сервер и хттп-клиент вкратце? Советую взять гугл и тщательно разобрать каждый вопрос, ответ на который тебе не понятен.
Snusmumriken
Если ты собрался чем-то таким заниматься, тебе придётся это досконально изучить. И модель OSI (TCP/IP), и то как работают протоколы, и кто что из них делает и так далее. Как работает вебсокет? Что это такое? Зачем вообще его изобретали?
Anatoliy
Ок почитаю потом буду дальше спрашивать
Snusmumriken
Ну прост если нахвататься информации с поверхности, при появлении хоть чего-то нового, не совсем стандартного или того что ты всё ещё не изучил, у тебя будет вылезать ступор, или адовые баги которые ты не знаешь как решить (и даже не знаешь какой вопрос задать гуглу чтобы тот ответил) и т.п. Перед сном можешь взять книжку "Компьютерные сети" от Олифера и Олифера. Книжка для лёгкого чтения, зубрить её не нужно, по крайней мере будешь более-менее понимать что происходит под капотом.
Snusmumriken
Карочи, уточнение: Диего Нехаб не писал поддержку вебсокетов в своём луасокете. Вебсокеты — это http-соединение, которое волшебным образом (через указание заголовков при запросе) превращается в постоянное, полностью меняя протокол с http на вебсокетный. Фактически, что происходит. Браузер такой: "сервер, давай текущее соединение по которому я тебе пишу сделаем вебсокетным!", а сервер такой: "а давай". И всё, теперь они общаются по вебсокету. Из аналогий в реальной жизни, это можно представить как "эй, сервер, чот английский язык недостаточно выразителен, давай перейдём на урдмутский". Сам протокол представления данных и организации приёма-передачи полностью меняется. Ну конечно, можно не апгрейдить хттп до вебсокета а с самого начала подключаться, так уже даже начали довольно часто делать, правда непонятно зачем.
vvzvlad
Вот он, аналог смены протокола
Pavel
ребят а в ngx lua module как вы строите работу с request ? делаете свою табличку request в которую все кладете, и дальше процессите ее между всеми функциями\модулями ? или каждый модуль сам процессит ngx.req что может привести к некоторому оверхеду
Snusmumriken
ребят а в ngx lua module как вы строите работу с request ? делаете свою табличку request в которую все кладете, и дальше процессите ее между всеми функциями\модулями ? или каждый модуль сам процессит ngx.req что может привести к некоторому оверхеду
В стандартизированной апишке — да, протаскивание request'а. Ну там, чот такое: local request = parse(...) local response = { succ = false, description = 'unknown error' } process(request, response) ngx.say(json.encode(response)) Основной прекол в том, что process, при ошибках может тупо менять поля request'а (дописывать description) и ретурнить, чтобы прервать дальнейший процесс, и т.п.
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? он не валиден? или вообще дичь пришла, то почему ы ему и не упасть...
Snusmumriken
да. но если он не может вычитать json? он не валиден? или вообще дичь пришла, то почему ы ему и не упасть...
1. cjson.safe 2. Быстрая проверка первых сорока символов body на предмет форматов (json/form body), все json'ы начинаются на { или [, все form-данные в закодированном теле имеют формат key=value&..., как query. Если такого нет — можно сгружать сырую тушку в request.body.
Saphire
Вот он, аналог смены протокола
У меня такое в русскоязычных чатах от внезапного заполнения истории английским случается..
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
У меня используется для оповещений в интерфейсе
Mikhail
Интересует вебсокет под винду
Artem
Интересует вебсокет под винду
А в чем принципиальная разница?
Mikhail
В отсутствии бинариков под винду. Я перешёл под линукс и решил все проблемы.
Artem
В отсутствии бинариков под винду. Я перешёл под линукс и решил все проблемы.
Я с виндой только на плюсах работал и было это лет 12 назад
Saphire
В отсутствии бинариков под винду. Я перешёл под линукс и решил все проблемы.
Сейчас бинарники под Винду делают кросскомпилятором имхо
Mikhail
Библиотеки на луа кросс платформа. А вот им необходимые компоненты не всегда.
Artem
Я могу конечно ошибаться, но так как вебсокеты - это просто протокол, то по идее должно все работать через стандартную сетевую библиотеку, а та в свою очередь вроде как точно под виндой должна работать
Artem
HTTP - это тоже протокол, а вот траспорт осущевствляет сокетная библиотека
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
я давно вас не радовал вниманием
Anonymous
Это libev чтоли?
Anonymous
Из виндового дистрибутива nodejs можешь спиздить , наверное
Tverd
в ноде разве не libuv ?
vitaly
а про порно было что нить?
Snusmumriken
(нет)
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
это я знаю
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