0Pricing
Lua Academy · 강의

서버 만들기

들어오는 연결을 받아 보세요.

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

서버 수명 주기

TCP 서버는 주소에 bind하고, 연결을 수신 대기한 다음, 클라이언트를 수락하고 처리하는 작업을 반복합니다.

LuaSocket에서는 socket.tcp()로 마스터를 생성하고, bind/listen으로 수신 대기 서버로 만든 다음, 대기열에서 accept를 사용해 클라이언트를 가져옵니다.

local socket = require("socket")
local server = assert(socket.tcp())

포트에 bind하기

server:bind(host, port)는 로컬 주소를 예약합니다. 모든 인터페이스에서 연결을 수락하려면 "*" 또는 "0.0.0.0"을 사용하고, 로컬 연결만 허용하려면 "127.0.0.1"을 사용하십시오.

다른 프로세스가 포트를 사용 중이면 bind가 "address already in use" 오류와 함께 실패합니다.

server:setoption("reuseaddr", true)
local ok, err = server:bind("*", 8080)
if not ok then error("bind failed: " .. err) end

클라이언트 수신 대기

server:listen(backlog)는 소켓을 수동 상태로 전환하고 들어오는 연결 설정 요청을 대기열에 넣기 시작합니다. backlog는 대기 중인 연결의 최대 개수입니다.

단축 형식인 socket.bind(host, port, backlog)는 bind와 listen을 한 번에 수행하고, 바로 사용할 수 있는 서버 객체를 반환합니다.

local socket = require("socket")
local server = assert(socket.bind("*", 8080, 32))
print("listening on", server:getsockname())

연결 수락하기

server:accept()는 클라이언트가 연결할 때까지 대기한 다음, 해당 상대를 위한 새 TCP 클라이언트 객체를 반환합니다. 서버 소켓 자체는 계속 수신 대기합니다.

시간 제한이 설정된 서버 소켓에서는 accept가 nil, "timeout"을 반환하므로 다른 작업을 번갈아 수행할 수 있습니다.

local client, err = server:accept()
if client then
  print("client from", client:getpeername())
end

클라이언트 하나 처리하기

연결을 수락한 후에는 반환된 객체를 클라이언트 소켓과 똑같이 다루십시오. receive로 요청을 받고 send로 응답을 보내면 됩니다.

클라이언트별 소켓에 별도의 시간 제한을 설정하여 느린 클라이언트 하나가 전체 서버를 멈추게 하지 마십시오.

client:settimeout(10)
local line = client:receive("*l")
if line then client:send(line .. "\n") end
client:close()

수락 반복문

전형적인 반복형 서버는 클라이언트를 수락하고, 처리하고, 연결을 닫은 다음 다시 반복하는 작업을 무한히 수행합니다. 한 번에 한 클라이언트만 처리합니다.

간단하고 올바르지만 동시 클라이언트를 처리할 수는 없습니다. 느린 요청 하나가 뒤에서 대기 중인 모든 클라이언트를 차단하기 때문입니다.

while true do
  local c = server:accept()
  if c then
    local msg = c:receive("*l")
    if msg then c:send(msg .. "\r\n") end
    c:close()
  end
end

최소 에코 서버

이를 모두 조합하면 에코 서버가 bind하고, 수신 대기한 다음, 각 클라이언트의 첫 번째 줄을 되돌려 보내는 작업을 반복합니다.

이것은 완전한 LuaSocket 서버의 가장 작은 형태이며, 앞서 만든 클라이언트를 시험하기에 좋은 대상입니다.

local socket = require("socket")
local s = assert(socket.bind("*", 8080))
while true do
  local c = s:accept()
  c:send((c:receive("*l") or "") .. "\r\n")
  c:close()
end

select를 사용한 동시성

스레드 없이 여러 클라이언트를 동시에 처리하려면 socket.select를 사용하십시오. 이 함수는 읽을 준비가 된 소켓을 반환하며, 새 클라이언트가 대기 중일 때는 수신 대기 서버 소켓도 포함합니다.

활성 클라이언트를 관리하는 table을 두고 데이터가 있는 소켓만 처리하면, 단일 스레드 이벤트 반복문을 응답성 있게 유지할 수 있습니다.

local readable = socket.select(watch, nil, 1)
for _, sock in ipairs(readable) do
  if sock == server then
    table.insert(watch, server:accept())
  end
end

비차단 수락

server:settimeout(0)을 설정하면 accept가 절대 대기하지 않습니다. select와 함께 사용하여 수신 대기 소켓을 실제로 읽을 수 있을 때만 accept를 호출하십시오.

이는 수백 개의 연결을 다중화하는 확장 가능한 단일 프로세스 서버의 기반입니다.

server:settimeout(0)
local ready = socket.select({server}, nil, 5)
if #ready > 0 then
  local c = server:accept()
end

클라이언트 오류 처리

클라이언트는 갑자기 연결을 끊을 수 있습니다. receive가 nil, "closed" 또는 부분 버퍼를 반환하면 감시 table에서 해당 클라이언트를 제거하고 소켓을 닫으십시오.

연결 하나의 오류 때문에 수락 반복문 전체가 중단되지 않도록 하십시오. 각 클라이언트의 오류를 격리해야 합니다.

local data, err = client:receive("*l")
if err == "closed" then
  client:close()
  remove_from_watch(client)
end

깔끔한 종료

종료할 때는 클라이언트 수락을 중지하고, 모든 활성 클라이언트 소켓을 닫은 다음, 포트를 해제하도록 수신 대기 서버를 닫으십시오.

bind할 때 reuseaddr를 설정하면 TCP TIME_WAIT 기간이 끝날 때까지 기다리지 않고 즉시 다시 시작할 수 있습니다.

for _, c in ipairs(clients) do c:close() end
server:close()
print("server stopped")

빠른 확인

새 마스터 소켓을 작동하는 수신 대기 소켓으로 바꾸는 호출 순서를 선택하십시오.

복습

reuseaddr를 사용해 TCP 서버를 bind하고, backlog를 지정해 수신 대기하며, accept를 반복 호출해 클라이언트를 처리했습니다.

간단한 반복형 반복문을 살펴본 뒤, socket.select를 사용한 비차단 동시성으로 확장하고 오류 격리와 깔끔한 종료도 구현했습니다. 다음에는 HTTP로 한 단계 올라가 보겠습니다.

자주 묻는 질문

“서버 만들기” 강의는 무료인가요?

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

“서버 만들기”에서 뭘 배우나요?

들어오는 연결을 받아 보세요. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“서버 만들기” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

  1. TCP 기초
  2. 클라이언트 만들기
  3. 서버 만들기
  4. HTTP 요청
← Lua Academy(으)로 돌아가기