0Pricing
Lua Academy · Урок

Неблокирующий ввод-вывод с 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
end

socket.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 — локальная установка не требуется.

Все уроки этого курса

  1. Создание простого цикла событий
  2. Асинхронность и ожидание с сопрограммами
  3. Шаблоны, подобные обещаниям
  4. Неблокирующий ввод-вывод с luasocket
← Назад к Lua Academy