Lua Academy · Pelajaran

Membangun Server

Terima koneksi masuk.

Pelajaran 3 dari 413 langkah

Membangun Server adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.

Siklus Hidup Peladen

Peladen TCP melakukan bind ke alamat, mendengarkan koneksi, lalu melakukan perulangan untuk menerima dan melayani klien.

Di LuaSocket, Anda membuat objek utama dengan socket.tcp(), mengubahnya menjadi peladen pendengar dengan bind/listen, dan mengambil klien dari antrean dengan accept.

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

Melakukan bind ke Porta

server:bind(host, port) mencadangkan alamat lokal. Gunakan "*" atau "0.0.0.0" untuk menerima koneksi pada setiap antarmuka, atau "127.0.0.1" agar hanya menerima koneksi lokal.

Bind gagal dengan "address already in use" jika proses lain sedang menggunakan porta tersebut.

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

Mendengarkan Klien

server:listen(backlog) menandai soket sebagai pasif dan mulai mengantre proses jabat tangan yang masuk. Antrean tunggu adalah jumlah maksimum koneksi yang tertunda.

Pintasan socket.bind(host, port, backlog) melakukan bind dan listen dalam satu pemanggilan, lalu mengembalikan objek peladen yang siap digunakan.

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

Menerima Koneksi

server:accept() memblokir sampai klien terhubung, lalu mengembalikan objek klien TCP baru untuk pihak tersebut. Soket peladen itu sendiri tetap mendengarkan.

Pada soket peladen dengan batas waktu, accept mengembalikan nil, "timeout", sehingga Anda dapat menyisipkan pekerjaan lain.

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

Melayani Satu Klien

Setelah menerima koneksi, perlakukan objek yang dikembalikan sama seperti soket klien: gunakan receive untuk permintaan dan send untuk respons.

Berikan soket setiap klien batas waktunya sendiri agar satu klien yang lambat tidak dapat menahan seluruh peladen.

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

Perulangan Penerimaan

Peladen iteratif klasik melakukan perulangan tanpa akhir: menerima klien, melayaninya, menutupnya, lalu mengulang. Cara ini menangani satu klien setiap kali.

Cara ini sederhana dan benar, tetapi tidak dapat melayani klien secara serentak karena permintaan yang lambat memblokir semua klien di belakangnya.

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

Peladen Gema Minimal

Jika disatukan, peladen gema melakukan bind, mendengarkan, lalu melakukan perulangan untuk menggemakan kembali baris pertama setiap klien.

Ini adalah peladen LuaSocket lengkap terkecil dan sasaran yang berguna bagi klien yang Anda bangun sebelumnya.

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

Konkurensi dengan select

Untuk melayani banyak klien sekaligus tanpa utas, gunakan socket.select. Fungsi ini mengembalikan soket yang siap dibaca, termasuk peladen pendengar saat klien baru sedang menunggu.

Anda mengelola table klien aktif dan hanya memproses klien yang memiliki data, sehingga perulangan peristiwa satu utas tetap responsif.

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

Penerimaan Non-Pemblokiran

Tetapkan server:settimeout(0) agar accept tidak pernah memblokir. Pasangkan dengan select sehingga Anda hanya memanggil accept saat soket pendengar benar-benar dapat dibaca.

Ini adalah dasar peladen satu proses yang dapat diskalakan dan memultipleks ratusan koneksi.

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

Menangani Kesalahan Klien

Klien dapat memutuskan koneksi secara tiba-tiba. Saat receive mengembalikan nil, "closed" atau penyangga parsial, hapus klien tersebut dari tabel pemantauan dan tutup soketnya.

Jangan pernah membiarkan satu koneksi rusak menghentikan perulangan penerimaan; pisahkan kegagalan setiap klien.

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

Penutupan Bersih

Saat menutup, hentikan penerimaan, tutup setiap soket klien aktif, lalu tutup peladen pendengar untuk membebaskan porta.

Menetapkan reuseaddr saat melakukan bind memungkinkan Anda memulai ulang segera tanpa menunggu periode TCP TIME_WAIT berlalu.

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

Pemeriksaan Singkat

Pilih urutan pemanggilan yang mengubah soket utama baru menjadi pendengar yang berfungsi.

Ringkasan

Anda telah membangun peladen TCP: melakukan bind dengan reuseaddr, mendengarkan dengan antrean tunggu, dan melakukan perulangan pada accept untuk melayani klien.

Anda melihat perulangan iteratif sederhana, lalu membuatnya dapat diskalakan dengan socket.select untuk konkurensi non-pemblokiran, serta isolasi kesalahan dan penutupan bersih. Selanjutnya Anda akan naik tingkat ke HTTP.

Gratis untuk memulai

Belajar Lua dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
40
Pelajaran
159

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Membangun Server” gratis?

Ya — teks lengkap “Membangun Server” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Membangun Server”?

Terima koneksi masuk. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Lua Academy?

Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Membangun Server” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?

Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Dasar-Dasar TCP
  2. Membangun Klien
  3. Membangun Server
  4. Permintaan HTTP
← Kembali ke Lua Academy