0Pricing
Lua Academy · Pelajaran

Dasar-Dasar TCP

Hubungkan dan kirim data.

Dasar-Dasar TCP adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 1 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.

Apa Itu LuaSocket

LuaSocket adalah pustaka jaringan yang paling umum digunakan untuk Lua. Pustaka ini menyediakan soket TCP dan UDP mentah, serta bantuan tingkat tinggi untuk protokol web, SMTP, dan FTP.

LuaSocket adalah modul C eksternal, jadi bukan bagian dari Lua standar. Anda memasangnya melalui LuaRocks dan memuatnya dengan require.

Tidak satu pun cuplikan dalam kursus ini dapat dijalankan di lingkungan latihan biasa karena cuplikan tersebut mengakses jaringan.

local socket = require("socket")
print(socket._VERSION)

Membuat Soket TCP

Objek intinya adalah soket utama TCP, yang dibuat dengan socket.tcp(). Soket utama yang baru dibuat belum tersambung dan belum terikat.

Dari soket utama, Anda dapat menggunakan connect (mengubahnya menjadi objek klien) atau bind+listen (mengubahnya menjadi objek peladen).

Sebagian besar pemanggilan mengembalikan nilai atau nil beserta string galat, jadi selalu simpan keduanya.

local socket = require("socket")
local tcp, err = socket.tcp()
if not tcp then error(err) end

Keluarga Alamat

TCP bekerja melalui IPv4 atau IPv6. socket.tcp() memilih keluarga alamat secara tertunda, sedangkan socket.tcp4() dan socket.tcp6() memaksa penggunaan salah satunya.

Gunakan socket.dns.toip(host) untuk menerjemahkan nama host menjadi alamat numerik sebelum tersambung jika Anda memerlukan pengendalian eksplisit.

local socket = require("socket")
local ip, info = socket.dns.toip("example.com")
print(ip)

Menyambung ke Host

conn:connect(host, port) melakukan jabat tangan tiga arah TCP. Jika berhasil, fungsi ini mengembalikan 1; jika gagal, fungsi ini mengembalikan nil dan pesan galat seperti "connection refused" atau "timeout".

Fungsi praktis socket.connect(host, port) membuat soket dan menyambungkannya dalam satu pemanggilan.

local socket = require("socket")
local conn, err = socket.connect("example.com", 80)
if not conn then print("failed:", err) end

Mengirim Data

conn:send(data) menulis byte ke soket. Fungsi ini mengembalikan indeks byte terakhir yang dikirim. Dengan soket yang menunggu, biasanya nilai ini adalah panjang penuh data.

TCP adalah aliran byte, bukan protokol pesan, sehingga satu send dapat terpisah atau tergabung dengan data lain saat dikirim melalui jaringan. Anda harus menentukan batas pesan sendiri.

local request = "GET / HTTP/1.0\r\n\r\n"
local sent, err = conn:send(request)
print("bytes sent:", sent)

Menerima Data

conn:receive(pattern) membaca dari aliran. Pola bawaan "*l" membaca satu baris tanpa baris baru. "*a" membaca sampai koneksi ditutup.

Anda juga dapat meneruskan angka untuk membaca tepat sejumlah byte tersebut. Jika terjadi galat, fungsi ini mengembalikan nil, string galat, dan data parsial yang telah diterima.

local line, err = conn:receive("*l")
local chunk = conn:receive(512)
local all = conn:receive("*a")

Menutup Koneksi

Selalu panggil conn:close() setelah selesai untuk melepaskan deskriptor berkas dan mengirim FIN TCP.

Anda dapat menutup sebagian koneksi dengan conn:shutdown("send") untuk menandai akhir aliran sambil tetap membaca tanggapan dari pihak lain. Ini berguna untuk protokol permintaan/tanggapan yang menggunakan "*a".

conn:shutdown("send")
local reply = conn:receive("*a")
conn:close()

Batas Waktu Itu Penting

Secara bawaan, soket menunggu tanpa batas. conn:settimeout(seconds) membatasi berapa lama sebuah pemanggilan menunggu. Nilai 0 membuat soket tidak memblokir.

Saat batas waktu tercapai, pemanggilan mengembalikan nil dan string "timeout". Selalu tetapkan batas waktu dalam lingkungan produksi agar koneksi tidak menunggu tanpa akhir.

conn:settimeout(5)
local data, err = conn:receive("*l")
if err == "timeout" then print("too slow") end

TCP dibandingkan dengan UDP

TCP berorientasi koneksi, berurutan, dan andal: bita tiba satu kali dan sesuai urutan, dengan konsekuensi adanya proses jabat tangan dan pengiriman ulang.

UDP (socket.udp()) tidak berorientasi koneksi dan tidak andal, tetapi ringan sehingga cocok untuk telemetri atau gim. Kursus ini berfokus pada TCP karena TCP menjadi dasar HTTP.

Pengiriman Sebagian dan Perulangan

Pada soket non-pemblokiran, send mungkin hanya mengirim sebagian penyangga Anda. Fungsi ini mengembalikan nil, "timeout", dan indeks bita terakhir yang sejauh ini berhasil ditulis.

Pengirim yang tangguh melakukan perulangan, melanjutkan dari bita setelah bita terakhir yang terkirim sampai seluruh penyangga terkirim.

local i = 1
while i <= #data do
  local sent, err, last = conn:send(data, i)
  i = (sent or last) + 1
  if err and err ~= "timeout" then break end
end

Memeriksa Koneksi

conn:getpeername() mengembalikan IP dan porta jarak jauh, sedangkan conn:getsockname() mengembalikan ujung lokal. Keduanya membantu pencatatan dan penelusuran kesalahan.

conn:setoption("keepalive", true) dan conn:setoption("tcp-nodelay", true) menyesuaikan perilaku soket yang mendasarinya.

local ip, port = conn:getpeername()
print("connected to", ip, port)
conn:setoption("tcp-nodelay", true)

Pemeriksaan Singkat

Uji pemahaman Anda tentang semantik penerimaan TCP.

Ringkasan

Anda telah mengenal objek utama TCP milik LuaSocket, mempelajari cara membuat, menghubungkan, mengirim, menerima, dan menutup soket, serta melihat bagaimana batas waktu dan penutupan separuh memengaruhi perilaku.

Ingatlah bahwa TCP adalah aliran bita, setiap pemanggilan dapat mengembalikan nil, err, dan soket untuk produksi selalu menetapkan batas waktu. Selanjutnya Anda akan merangkai bagian-bagian ini menjadi klien yang berfungsi.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Dasar-Dasar TCP” gratis?

Ya — teks lengkap “Dasar-Dasar TCP” 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 “Dasar-Dasar TCP”?

Hubungkan dan kirim data. 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 1 dari 4.

Berapa lama pelajaran “Dasar-Dasar TCP” 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