Membangun Server
Terima koneksi masuk.
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) endMendengarkan 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())
endMelayani 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
endPeladen 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()
endKonkurensi 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
endPenerimaan 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()
endMenangani 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)
endPenutupan 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.
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
- Dasar-Dasar TCP
- Membangun Klien
- Membangun Server
- Permintaan HTTP