0Pricing
Lua Academy · Pelajaran

Membangun Klien

Minta data dari server.

Membangun Klien adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 2 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 Klien

Klien TCP mengikuti siklus hidup yang jelas: membuat soket, terhubung ke peladen, bertukar data, lalu menutupnya.

Di LuaSocket, setiap langkah berupa satu pemanggilan metode dan masing-masing dapat gagal. Klien yang ditulis dengan baik memeriksa setiap nilai yang dikembalikan dan membersihkan soketnya pada setiap jalur kesalahan.

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

Menghubungkan dengan Aman

Tetapkan batas waktu koneksi sebelum memanggil connect agar peladen yang tidak merespons tidak membuat program Anda menunggu tanpa akhir. Beberapa detik biasanya cukup.

Jika connect mengembalikan nil, catat kesalahannya dan hentikan operasi. Jangan pernah menganggap proses jabat tangan berhasil.

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

Menggunakan socket.connect

Untuk kasus umum, socket.connect(host, port) membungkus pembuatan dan koneksi. Fungsi ini mengembalikan objek klien yang siap digunakan atau nil dan sebuah kesalahan.

Bentuk ini ringkas, tetapi tidak memberi Anda kesempatan untuk menetapkan batas waktu sebelum proses jabat tangan, jadi pilih bentuk eksplisit untuk jaringan yang tidak andal.

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

Mengirim Permintaan

Setelah terhubung, tulis bita permintaan dengan send. Banyak protokol teks membatasi baris dengan karakter kembali ke awal baris + baris baru (\r\n).

Karena TCP berupa aliran, akhiri setiap pesan logis dengan jelas agar peladen mengetahui tempat berakhirnya.

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

Membaca Balasan Baris

Untuk protokol berbasis baris, lakukan perulangan pembacaan dengan pola "*l". Setiap pemanggilan mengembalikan satu baris tanpa penghentinya.

Saat mengembalikan nil, periksa kesalahannya: "closed" berarti peladen memutuskan koneksi, sedangkan "timeout" berarti tidak ada data yang tiba tepat waktu.

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

Membaca Seluruh Respons

Protokol permintaan/respons sering kali membaca semuanya sampai peladen menutup koneksi. Gunakan "*a" untuk menangkap seluruh isi.

Jika Anda terlebih dahulu melakukan penutupan separuh pada sisi pengiriman dengan shutdown("send"), peladen melihat akhir masukan dan dapat menyelesaikan balasannya.

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

Pembingkaian Panjang Tetap

Protokol biner sering mengawali setiap pesan dengan panjangnya. Baca tajuk panjang terlebih dahulu, lalu baca tepat sebanyak bita tersebut.

Meneruskan angka ke receive akan memblokir sampai jumlah tersebut tiba atau soket mengalami kesalahan, sehingga memberi pembingkaian yang tepat atas aliran bita.

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

Klien Gema Lengkap

Berikut seluruh alurnya: terhubung, mengirim satu baris, membaca baris yang digemakan, lalu menutup. Inilah bentuk baku klien LuaSocket.

Perhatikan bahwa setiap pemanggilan yang dapat gagal dilindungi dengan assert demi keringkasan, tetapi klien nyata akan menangani kesalahan dengan baik.

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()

Menangani Pemutusan Koneksi

Peladen dapat memutuskan koneksi kapan saja. Pengiriman dengan send kepada pihak terhubung yang telah ditutup mungkin mengembalikan nil, "closed", sedangkan receive mengembalikan data parsial beserta kesalahannya.

Perlakukan "closed" sebagai keadaan akhir yang normal, bukan kerusakan. Logika penyambungan ulang sebaiknya ditempatkan dalam pembungkus percobaan ulang di sekitar klien.

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

Klien Non-Pemblokiran

Tetapkan batas waktu ke 0 untuk klien yang sepenuhnya non-pemblokiran. Pemanggilan kemudian segera mengembalikan hasil, dengan menandakan "timeout" ketika tidak ada kemajuan yang mungkin.

Gabungkan ini dengan socket.select untuk menunggu kesiapan secara efisien di banyak soket tanpa melakukan perulangan sibuk.

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

Menyelesaikan Nama Host

Jika Anda terhubung menggunakan nama host, LuaSocket akan menyelesaikannya untuk Anda. Untuk memeriksa atau menyimpan hasil resolusi dalam tembolok, panggil socket.dns.toip atau socket.dns.getaddrinfo sendiri.

Melakukan resolusi sekali lalu terhubung menggunakan IP menghindari pencarian DNS berulang dalam perulangan penyambungan ulang yang rapat.

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

Pemeriksaan Singkat

Pilih cara yang benar untuk membaca semua yang dikirim peladen sampai peladen menutup koneksi.

Ringkasan

Anda telah membangun klien TCP secara menyeluruh: terhubung dengan batas waktu, membingkai dan mengirim permintaan, membaca respons berbasis baris, jumlah bita, atau seluruh aliran, lalu menutup dengan bersih.

Anda juga melihat penanganan pemutusan koneksi, mode non-pemblokiran dengan select, dan penyimpanan DNS dalam tembolok. Selanjutnya Anda akan menulis sisi peladen yang menjawab klien-klien ini.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Membangun Klien” gratis?

Ya — teks lengkap “Membangun Klien” 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 Klien”?

Minta data dari server. 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 2 dari 4.

Berapa lama pelajaran “Membangun Klien” 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