Неблокирующий ввод-вывод с luasocket
Используйте luasocket в неблокирующем режиме совместно с планировщиком сопрограмм.
«Неблокирующий ввод-вывод с luasocket» — бесплатный урок Lua Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Что такое luasocket
luasocket — это библиотека Lua, предоставляющая сокеты TCP/UDP, клиенты HTTP, FTP и SMTP. По умолчанию она блокирующая; неблокирующий режим позволяет выполнять асинхронный ввод-вывод.
Установка luasocket
Установите библиотеку через LuaRocks: luarocks install luasocket. Подключите её в скрипте.
local socket = require("socket")
local tcp = socket.tcp()Создание TCP-сокета
Создайте клиентский TCP-сокет и подключитесь к серверу.
local tcp = socket.tcp()
tcp:connect("example.com", 80)
tcp:send("GET / HTTP/1.0\r\nHost: example.com\r\n\r\n")
local response = tcp:receive("*a")
tcp:close()
print(response:sub(1, 200))Неблокирующий режим
Переведите сокет в неблокирующий режим с помощью tcp:settimeout(0). Операции чтения и записи немедленно возвращают ошибку времени ожидания, если данные не готовы.
tcp:settimeout(0) -- non-blocking
local data, err = tcp:receive(1024)
if err == "timeout" then
-- no data yet, try again later
elseif data then
print("Got:", data)
endИнтеграция с корутинами
Объедините неблокирующие сокеты с корутинами: уступайте управление, когда данные не готовы, и возобновляйте корутину, когда селектор сообщает о готовности.
local function readAsync(sock)
while true do
local data, err = sock:receive(1024)
if data then return data end
if err ~= "timeout" then error(err) end
coroutine.yield() -- let other tasks run
end
endsocket.select
socket.select(readSet, writeSet, timeout) возвращает наборы сокетов, готовых к вводу-выводу, — это основа полноценного цикла событий.
local readable, writable = socket.select({sock1, sock2}, nil, 0.1)
for _, s in ipairs(readable) do
local data = s:receive(1024)
-- handle data
endКлиент HTTP
luasocket включает высокоуровневый модуль HTTP для простых запросов.
local http = require("socket.http")
local body, code = http.request("http://example.com")
print(code, #body)UDP-сокеты
UDP не устанавливает соединение. Используйте socket.udp() для обмена дейтаграммами.
local udp = socket.udp()
udp:setsockname("*", 0)
udp:sendto("hello", "127.0.0.1", 9999)
local data = udp:receive()
udp:close()Время ожидания
Установите время ожидания с помощью :settimeout(seconds). Значение 0 означает неблокирующий режим; положительное число допускает частичную блокировку; nil означает бесконечное ожидание.
Шаблон обработки ошибок
Функции luasocket при сбое возвращают nil и строку с ошибкой. Всегда проверяйте второе возвращаемое значение.
local ok, err = tcp:connect("host", 80)
if not ok then
error("Connection failed: " .. tostring(err))
endАльтернатива OpenResty
Для производительного неблокирующего ввода-вывода в LuaJIT косокеты OpenResty значительно функциональнее и быстрее. Используйте luasocket для автономных скриптов и простых инструментов.
Вопрос о неблокирующем режиме
Что делает tcp:settimeout(0)?
Повторение: неблокирующий ввод-вывод
Используйте settimeout(0) для неблокирующих сокетов и socket.select для мультиплексирования ввода-вывода. Объединяйте их с корутинами: уступайте управление при истечении времени ожидания и возобновляйте корутину после готовности данных. Для высокопроизводительного асинхронного ввода-вывода предпочитайте OpenResty или luv.
Часто задаваемые вопросы
Урок «Неблокирующий ввод-вывод с luasocket» бесплатный?
Да — полный текст урока «Неблокирующий ввод-вывод с luasocket» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Неблокирующий ввод-вывод с luasocket»?
Используйте luasocket в неблокирующем режиме совместно с планировщиком сопрограмм. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Неблокирующий ввод-вывод с luasocket»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Создание простого цикла событий
- Асинхронность и ожидание с сопрограммами
- Шаблоны, подобные обещаниям
- Неблокирующий ввод-вывод с luasocket