I/O Non-Pemblokiran dengan luasocket
Gunakan luasocket dalam mode non-pemblokiran yang terintegrasi dengan penjadwal coroutine.
I/O Non-Pemblokiran dengan luasocket adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 4 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 Lua yang menyediakan soket TCP/UDP, klien HTTP, FTP, dan SMTP. Secara bawaan, pustaka ini memblokir; mode nonblokir memungkinkan masukan/keluaran asinkron.
Memasang luasocket
Pasang melalui LuaRocks: luarocks install luasocket. Sertakan pustaka tersebut dalam skrip Anda.
local socket = require("socket")
local tcp = socket.tcp()Membuat Soket TCP
Buat soket klien TCP dan sambungkan ke server.
local tcp = socket.tcp()
tcp:connect("example.com", 80)
tcp:send("GET / HTTP/1.0\r\nHost: example.com\r\n\r\n")
local response = tcp:receive("*a")
tcp:close()
print(response:sub(1, 200))Mode Nonblokir
Atur soket menjadi nonblokir dengan tcp:settimeout(0). Pembacaan/penulisan segera mengembalikan hasil dengan kesalahan batas waktu jika tidak ada data yang siap.
tcp:settimeout(0) -- non-blocking
local data, err = tcp:receive(1024)
if err == "timeout" then
-- no data yet, try again later
elseif data then
print("Got:", data)
endIntegrasi Korutin
Gabungkan soket nonblokir dengan korutin: jeda ketika data belum siap, lalu lakukan resume terhadap korutin ketika pemilih menunjukkan bahwa data siap.
local function readAsync(sock)
while true do
local data, err = sock:receive(1024)
if data then return data end
if err ~= "timeout" then error(err) end
coroutine.yield() -- let other tasks run
end
endsocket.select
socket.select(readSet, writeSet, timeout) mengembalikan kumpulan soket yang siap untuk masukan/keluaran — dasar loop peristiwa yang tepat.
local readable, writable = socket.select({sock1, sock2}, nil, 0.1)
for _, s in ipairs(readable) do
local data = s:receive(1024)
-- handle data
endKlien HTTP
luasocket menyertakan modul HTTP tingkat tinggi untuk permintaan sederhana.
local http = require("socket.http")
local body, code = http.request("http://example.com")
print(code, #body)Soket UDP
UDP tidak memerlukan koneksi. Gunakan socket.udp() untuk komunikasi berbasis datagram.
local udp = socket.udp()
udp:setsockname("*", 0)
udp:sendto("hello", "127.0.0.1", 9999)
local data = udp:receive()
udp:close()Batas Waktu
Atur batas waktu dengan :settimeout(seconds). Batas waktu 0 berarti nonblokir; angka positif memungkinkan pemblokiran sebagian; nilai nihil berarti memblokir tanpa batas.
Pola Penanganan Kesalahan
Fungsi luasocket mengembalikan nilai nihil + string kesalahan saat gagal. Selalu periksa nilai kembalian kedua.
local ok, err = tcp:connect("host", 80)
if not ok then
error("Connection failed: " .. tostring(err))
endAlternatif OpenResty
Untuk masukan/keluaran nonblokir dalam LuaJIT pada lingkungan produksi, soket kooperatif OpenResty jauh lebih mumpuni dan berkinerja lebih baik. Gunakan luasocket untuk skrip mandiri dan alat sederhana.
Pertanyaan tentang Nonblokir
Apa yang dilakukan tcp:settimeout(0)?
Ringkasan: Masukan/Keluaran Nonblokir
Gunakan settimeout(0) untuk soket nonblokir dan socket.select untuk multiplexing masukan/keluaran. Gabungkan dengan korutin: jeda saat batas waktu tercapai, lalu lakukan resume ketika data siap. Untuk masukan/keluaran asinkron berkinerja tinggi, pilih OpenResty atau luv.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “I/O Non-Pemblokiran dengan luasocket” gratis?
Ya — teks lengkap “I/O Non-Pemblokiran dengan luasocket” 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 “I/O Non-Pemblokiran dengan luasocket”?
Gunakan luasocket dalam mode non-pemblokiran yang terintegrasi dengan penjadwal coroutine. 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 4 dari 4.
Berapa lama pelajaran “I/O Non-Pemblokiran dengan luasocket” 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
- Membangun Perulangan Peristiwa Sederhana
- Async/Await dengan Coroutine
- Pola Mirip Promise
- I/O Non-Pemblokiran dengan luasocket