Membina Klien
Minta data daripada pelayan.
Membina Klien ialah pelajaran Lua Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Lua Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.
Kitar Hayat Klien
Klien TCP mengikuti kitar hayat yang jelas: mencipta soket, menyambung ke pelayan, bertukar data, kemudian menutup soket.
Dalam LuaSocket, setiap langkah ialah satu panggilan kaedah dan setiap langkah boleh gagal. Klien yang ditulis dengan baik akan memeriksa setiap nilai pulangan dan membersihkan soketnya pada mana-mana laluan ralat.
local socket = require("socket")
local client = assert(socket.tcp())Menyambung dengan Selamat
Tetapkan masa tamat sambungan sebelum memanggil connect supaya hos yang tidak bertindak balas tidak menyebabkan program Anda tergantung. Beberapa saat biasanya mencukupi.
Jika connect mengembalikan nil, catatkan ralat dan hentikan proses. Jangan sekali-kali menganggap proses jabat tangan telah berjaya.
client:settimeout(5)
local ok, err = client:connect("127.0.0.1", 8080)
if not ok then
client:close()
error("connect failed: " .. err)
endMenggunakan socket.connect
Untuk kes biasa, socket.connect(host, port) menggabungkan penciptaan dan sambungan. Ia mengembalikan objek klien yang sedia digunakan atau nil bersama-sama ralat.
Bentuk ini ringkas, tetapi tidak memberi Anda peluang untuk menetapkan masa tamat sebelum proses jabat tangan. Oleh itu, gunakan bentuk eksplisit untuk rangkaian yang tidak boleh dipercayai.
local socket = require("socket")
local client, err = socket.connect("example.com", 13)
if not client then error(err) endMenghantar Permintaan
Selepas disambungkan, tulis bait permintaan menggunakan send. Banyak protokol teks menandakan sempadan baris dengan pulangan pengangkutan + baris baharu (\r\n).
Oleh sebab TCP ialah strim, tamatkan setiap mesej logik dengan jelas supaya pelayan mengetahui tempat mesej itu berakhir.
local msg = "PING\r\n"
local sent, err = client:send(msg)
if not sent then error("send failed: " .. err) endMembaca Balasan Satu Baris
Untuk protokol berasaskan baris, ulang pembacaan menggunakan corak "*l". Setiap panggilan mengembalikan satu baris tanpa penamatnya.
Apabila mendapat nil, periksa ralat tersebut: "closed" bermaksud pelayan telah memutuskan sambungan, manakala "timeout" bermaksud tiada data tiba dalam masa yang ditetapkan.
client:settimeout(5)
local line, err = client:receive("*l")
if line then
print("server said:", line)
else
print("recv error:", err)
endMembaca Respons Penuh
Protokol permintaan/respons selalunya membaca semuanya sehingga pelayan menutup sambungan. Gunakan "*a" untuk menangkap seluruh badan.
Jika Anda menutup separa bahagian penghantaran terlebih dahulu dengan shutdown("send"), pelayan akan melihat penghujung masukan dan boleh menyiapkan 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 binari selalunya meletakkan panjang setiap mesej pada bahagian awal. Baca pengepala panjang terlebih dahulu, kemudian baca tepat sebanyak bait tersebut.
Dengan memberikan nombor kepada receive, operasi akan tersekat sehingga jumlah bait itu tiba atau soket mengalami ralat, lalu memberikan pembingkaian yang tepat pada strim bait.
local header = client:receive(4)
local len = string.unpack(">I4", header)
local payload = client:receive(len)Klien Gema Lengkap
Inilah keseluruhan alirannya: sambung, hantar satu baris, baca baris yang digemakan dan tutup sambungan. Inilah bentuk standard klien LuaSocket.
Perhatikan bahawa setiap panggilan yang boleh gagal dilindungi dengan assert demi keringkasan, tetapi klien sebenar akan mengendalikan ralat dengan sewajarnya.
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()Mengendalikan Pemutusan Sambungan
Pelayan boleh memutuskan sambungan pada bila-bila masa. Operasi send kepada pihak satu lagi yang telah ditutup mungkin mengembalikan nil, "closed", manakala receive mengembalikan data separa bersama-sama ralat.
Anggap "closed" sebagai keadaan penamatan biasa, bukan sebagai ranap. Logik penyambungan semula hendaklah diletakkan dalam pembungkus percubaan semula di sekeliling klien.
local data, err, partial = client:receive("*a")
if err == "closed" then
print("peer closed, got", #partial, "bytes")
endKlien Tanpa Sekatan
Tetapkan masa tamat kepada 0 untuk klien yang sepenuhnya tanpa sekatan. Panggilan kemudiannya akan mengembalikan hasil serta-merta dan menandakan "timeout" apabila tiada kemajuan dapat dibuat.
Gabungkan pendekatan ini dengan socket.select untuk menunggu kesediaan pada banyak soket dengan cekap tanpa menjalankan gelung sibuk.
client:settimeout(0)
local r = socket.select({client}, nil, 5)
if #r > 0 then print(client:receive("*l")) endMenyelesaikan Nama Hos
Jika Anda menyambung menggunakan nama hos, LuaSocket akan menyelesaikannya untuk Anda. Untuk memeriksa atau menyimpan hasil penyelesaian itu, panggil socket.dns.toip atau socket.dns.getaddrinfo sendiri.
Menyelesaikan nama sekali dan menyambung melalui IP mengelakkan carian DNS berulang dalam gelung sambungan semula yang pantas.
local socket = require("socket")
local ip = assert(socket.dns.toip("example.com"))
local c = assert(socket.connect(ip, 80))Semakan Pantas
Pilih cara yang betul untuk membaca semua yang dihantar oleh pelayan sehingga pelayan menutup sambungan.
Ringkasan
Anda telah membina klien TCP dari awal hingga akhir: menyambung dengan masa tamat, membingkai dan menghantar permintaan, membaca respons mengikut baris, bilangan bait atau strim penuh, serta menutup sambungan dengan kemas.
Anda juga telah melihat pengendalian pemutusan sambungan, mod tanpa sekatan dengan select dan penyimpanan hasil DNS. Seterusnya, Anda akan menulis bahagian pelayan yang menjawab klien-klien ini.
Pelajari Lua dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 40
- Pelajaran
- 159
Soalan Lazim
Adakah pelajaran “Membina Klien” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Lua Academy, termasuk “Membina Klien”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Membina Klien”?
Minta data daripada pelayan. Anda berlatih Lua Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Lua Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Lua Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Membina Klien” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Lua Academy ini?
Ya. Setiap pelajaran Lua Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Asas TCP
- Membina Klien
- Membina Pelayan
- Permintaan HTTP