0Pricing
Lua Academy · 강의

luasocket을 이용한 논블로킹 입출력

코루틴 스케줄러와 통합된 논블로킹 모드에서 luasocket을 사용합니다.

luasocket을 이용한 논블로킹 입출력은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Lua Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

루아소켓이란 무엇입니까

루아소켓은 TCP/UDP 소켓, HTTP, FTP, SMTP 클라이언트를 제공하는 Lua 라이브러리입니다. 기본적으로는 차단 방식이며, 비차단 모드를 사용하면 비동기 입출력이 가능합니다.

루아소켓 설치

LuaRocks를 통해 설치합니다: luarocks install luasocket. 스크립트에서 require합니다.

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

코루틴 통합

비차단 소켓과 코루틴을 결합합니다. 데이터를 사용할 수 없을 때 yield하고, 선택기가 준비 상태를 알리면 코루틴을 resume합니다.

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 클라이언트

루아소켓에는 간단한 요청을 위한 고수준 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과 오류 문자열을 반환합니다. 항상 두 번째 반환값을 확인해야 합니다.

local ok, err = tcp:connect("host", 80)
if not ok then
  error("Connection failed: " .. tostring(err))
end

OpenResty 대안

LuaJIT에서 운영 환경의 비차단 입출력을 구현할 때는 OpenResty의 코소켓이 훨씬 강력하고 성능이 뛰어납니다. 독립 실행형 스크립트와 간단한 도구에는 루아소켓을 사용합니다.

비차단 질문

tcp:settimeout(0)은 무엇을 합니까?

복습: 비차단 입출력

비차단 소켓에는 settimeout(0)을, 입출력 다중화에는 socket.select를 사용합니다. 코루틴과 결합하여 시간 초과가 발생하면 yield하고 데이터가 준비되면 resume합니다. 고성능 비동기 입출력에는 OpenResty 또는 luv를 사용하는 것이 좋습니다.

자주 묻는 질문

“luasocket을 이용한 논블로킹 입출력” 강의는 무료인가요?

네 — “luasocket을 이용한 논블로킹 입출력” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“luasocket을 이용한 논블로킹 입출력”에서 뭘 배우나요?

코루틴 스케줄러와 통합된 논블로킹 모드에서 luasocket을 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Lua Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“luasocket을 이용한 논블로킹 입출력” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 간단한 이벤트 루프 만들기
  2. 코루틴을 이용한 비동기/대기
  3. 프로미스 유사 패턴
  4. luasocket을 이용한 논블로킹 입출력
← Lua Academy(으)로 돌아가기