0Pricing
Lua Academy · 강의

클라이언트 만들기

서버에 데이터를 요청해 보세요.

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

클라이언트 수명 주기

TCP 클라이언트는 소켓 생성, 서버 연결, 데이터 교환, 연결 종료라는 명확한 수명 주기를 따릅니다.

LuaSocket에서는 각 단계가 하나의 메서드 호출이며, 각각 실패할 수 있습니다. 잘 작성된 클라이언트는 모든 반환 값을 확인하고 어떤 오류 경로에서도 소켓을 정리합니다.

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

안전하게 연결하기

connect를 호출하기 전에 연결 시간 제한을 설정하여 응답하지 않는 호스트 때문에 프로그램이 멈추지 않도록 하십시오. 보통 몇 초로 설정합니다.

connect가 nil을 반환하면 오류를 기록하고 중단하십시오. 연결 설정이 성공했다고 절대 가정하지 마십시오.

client:settimeout(5)
local ok, err = client:connect("127.0.0.1", 8080)
if not ok then
  client:close()
  error("connect failed: " .. err)
end

socket.connect 사용

일반적인 경우에는 socket.connect(host, port)가 생성과 연결을 한 번에 처리합니다. 연결할 준비가 된 클라이언트 객체를 반환하거나, nil과 오류를 반환합니다.

간결하지만 연결 설정 전에 시간 제한을 설정할 기회가 없으므로, 신뢰할 수 없는 네트워크에서는 명시적인 형식을 사용하는 편이 좋습니다.

local socket = require("socket")
local client, err = socket.connect("example.com", 13)
if not client then error(err) end

요청 보내기

연결되면 send로 요청 바이트를 작성하십시오. 많은 텍스트 프로토콜은 캐리지 리턴 + 줄 바꿈(\r\n)으로 줄을 구분합니다.

TCP는 스트림이므로 서버가 끝을 알 수 있도록 각 논리적 메시지를 명확하게 종료하십시오.

local msg = "PING\r\n"
local sent, err = client:send(msg)
if not sent then error("send failed: " .. err) end

줄 단위 응답 읽기

줄 단위 프로토콜에서는 "*l" 패턴을 사용해 반복해서 읽으십시오. 각 호출은 종료 문자를 제외한 한 줄을 반환합니다.

nil이 반환되면 오류를 확인하십시오. "closed"는 서버가 연결을 끊었다는 뜻이고, "timeout"은 정해진 시간 안에 데이터가 도착하지 않았다는 뜻입니다.

client:settimeout(5)
local line, err = client:receive("*l")
if line then
  print("server said:", line)
else
  print("recv error:", err)
end

전체 응답 읽기

요청/응답 프로토콜에서는 서버가 연결을 닫을 때까지 모든 내용을 읽는 경우가 많습니다. "*a"를 사용해 전체 본문을 가져오십시오.

shutdown("send")로 먼저 송신 방향을 반쯤 닫으면 서버가 입력 끝을 감지하고 응답을 마칠 수 있습니다.

client:send("GET DATA\r\n")
client:shutdown("send")
local body, err = client:receive("*a")
print(#(body or ""), "bytes received")

고정 길이 프레이밍

바이너리 프로토콜에서는 각 메시지 앞에 길이를 붙이는 경우가 많습니다. 먼저 길이 헤더를 읽은 다음 정확히 그만큼의 바이트를 읽으십시오.

receive에 숫자를 전달하면 해당 바이트 수가 도착하거나 소켓에서 오류가 발생할 때까지 대기하므로, 바이트 스트림에서 메시지를 정확하게 구분할 수 있습니다.

local header = client:receive(4)
local len = string.unpack(">I4", header)
local payload = client:receive(len)

완전한 에코 클라이언트

전체 흐름은 다음과 같습니다. 연결하고, 한 줄을 보내고, 에코된 줄을 읽은 다음, 연결을 닫습니다. 이것이 전형적인 LuaSocket 클라이언트 형태입니다.

간결하게 표현하기 위해 실패할 수 있는 모든 호출을 assert로 감싼 점에 주목하십시오. 실제 클라이언트라면 오류를 적절히 처리해야 합니다.

local socket = require("socket")
local c = assert(socket.connect("127.0.0.1", 8080))
assert(c:send("hello\r\n"))
print(c:receive("*l"))
c:close()

연결 끊김 처리

서버는 언제든 연결을 끊을 수 있습니다. 연결이 닫힌 상대에게 send를 호출하면 nil, "closed"를 반환할 수 있으며, receive는 부분 데이터와 오류를 함께 반환합니다.

"closed"를 충돌이 아니라 정상적인 종료 상태로 처리하십시오. 재연결 로직은 클라이언트를 감싸는 재시도 래퍼에 두어야 합니다.

local data, err, partial = client:receive("*a")
if err == "closed" then
  print("peer closed, got", #partial, "bytes")
end

비차단 클라이언트

완전히 비차단인 클라이언트를 만들려면 시간 제한을 0으로 설정하십시오. 그러면 호출이 즉시 반환되며, 진행할 수 없을 때 "timeout"을 알립니다.

이를 socket.select와 함께 사용하면 바쁜 대기 없이 여러 소켓의 준비 상태를 효율적으로 기다릴 수 있습니다.

client:settimeout(0)
local r = socket.select({client}, nil, 5)
if #r > 0 then print(client:receive("*l")) end

호스트 이름 확인

호스트 이름으로 연결하면 LuaSocket이 대신 이름을 확인합니다. 이 확인 결과를 살펴보거나 캐시하려면 socket.dns.toip 또는 socket.dns.getaddrinfo를 직접 호출하십시오.

한 번만 확인한 뒤 IP로 연결하면 빠른 재연결 반복문에서 DNS를 반복해서 조회하는 일을 피할 수 있습니다.

local socket = require("socket")
local ip = assert(socket.dns.toip("example.com"))
local c = assert(socket.connect(ip, 80))

빠른 확인

서버가 연결을 닫을 때까지 보내는 모든 내용을 올바르게 읽는 방법을 선택하십시오.

복습

시간 제한을 두고 TCP 클라이언트를 처음부터 끝까지 만들었습니다. 연결하고, 요청을 구분해 보내고, 줄 단위·바이트 수 지정·전체 스트림 방식으로 응답을 읽은 다음, 깔끔하게 연결을 닫았습니다.

또한 연결 끊김 처리, select를 사용한 비차단 모드, DNS 캐싱도 살펴보았습니다. 다음에는 이러한 클라이언트에 응답하는 서버 측을 작성해 보겠습니다.

자주 묻는 질문

“클라이언트 만들기” 강의는 무료인가요?

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

“클라이언트 만들기”에서 뭘 배우나요?

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

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

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

“클라이언트 만들기” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

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