TCP:n perusteet
Muodostakaa yhteys ja lähettäkää dataa.
TCP:n perusteet on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.
Mikä LuaSocket on
LuaSocket on käytännössä Luan vakiintunut verkkokirjasto. Se tarjoaa raakatason TCP- ja UDP-socketit sekä korkeamman tason apufunktiot HTTP:tä, SMTP:tä ja FTP:tä varten.
Se on ulkoinen C-moduuli, joten se ei kuulu vakio-Luaan. Asentakaa se LuaRocksilla ja ladatkaa se komennolla require.
Mikään tämän kurssin koodiesimerkeistä ei toimi tavallisessa kokeiluympäristössä, koska ne käyttävät verkkoa.
local socket = require("socket")
print(socket._VERSION)TCP-socketin luominen
Ydinobjekti on TCP-master-socketti, joka luodaan komennolla socket.tcp(). Uusi master-socketti ei ole yhdistetty eikä sidottu mihinkään osoitteeseen.
Master-socketista voitte joko kutsua connect-komentoa, jolloin siitä tulee asiakasolio, tai komentoja bind+listen, jolloin siitä tulee palvelinolio.
Useimmat kutsut palauttavat joko arvon tai nil-arvon ja virhemerkkijonon, joten kaapatkaa aina molemmat.
local socket = require("socket")
local tcp, err = socket.tcp()
if not tcp then error(err) endOsoiteperhe
TCP toimii IPv4:n tai IPv6:n kautta. socket.tcp() valitsee osoiteperheen tarpeen mukaan, kun taas socket.tcp4() ja socket.tcp6() pakottavat käyttämään tiettyä perhettä.
Käyttäkää komentoa socket.dns.toip(host) isäntänimen muuntamiseen numeeriseksi osoitteeksi ennen yhdistämistä, jos tarvitsette tarkkaa hallintaa.
local socket = require("socket")
local ip, info = socket.dns.toip("example.com")
print(ip)Yhdistäminen isäntään
conn:connect(host, port) suorittaa TCP:n kolmivaiheisen kättelyn. Onnistuneena se palauttaa arvon 1; epäonnistuessaan se palauttaa nil-arvon ja virheilmoituksen, kuten "connection refused" tai "timeout".
Apufunktio socket.connect(host, port) luo socketin ja muodostaa yhteyden yhdellä kutsulla.
local socket = require("socket")
local conn, err = socket.connect("example.com", 80)
if not conn then print("failed:", err) endDatan lähettäminen
conn:send(data) kirjoittaa tavuja sockettiin. Se palauttaa viimeksi lähetetyn tavun indeksin. Blokkaavalla socketilla tämä on yleensä data-arvon koko pituus.
TCP on tavujono, ei viestiprotokolla, joten yksittäinen send-kutsu voidaan jakaa osiin tai yhdistää muiden kutsujen kanssa verkkosiirron aikana. Teidän on määritettävä viestien kehystys itse.
local request = "GET / HTTP/1.0\r\n\r\n"
local sent, err = conn:send(request)
print("bytes sent:", sent)Datan vastaanottaminen
conn:receive(pattern) lukee dataa virrasta. Oletuskuvio "*l" lukee yhden rivin ilman rivinvaihtoa. "*a" lukee yhteyden sulkeutumiseen asti.
Voitte antaa myös numeron lukeaksenne täsmälleen kyseisen määrän tavuja. Virhetilanteessa funktio palauttaa nil-arvon, virhemerkkijonon ja mahdollisesti vastaanotetun osittaisen datan.
local line, err = conn:receive("*l")
local chunk = conn:receive(512)
local all = conn:receive("*a")Yhteyden sulkeminen
Kutsukaa aina conn:close()-komentoa työn valmistuttua, jotta tiedostokuvaaja vapautuu ja TCP FIN lähetetään.
Voitte sulkea yhteyden puoliksi komennolla conn:shutdown("send"), jolloin ilmoitatte virran päättymisestä mutta voitte edelleen lukea vastapuolen vastauksen. Tämä on kätevää pyyntö-vastausprotokollissa, joissa käytetään kuviota "*a".
conn:shutdown("send")
local reply = conn:receive("*a")
conn:close()Aikakatkaisut ovat tärkeitä
Socketit ovat oletuksena blokkaavia ja voivat odottaa ikuisesti. conn:settimeout(seconds) rajoittaa kutsun odotusaikaa. Arvo 0 tekee socketista ei-blokkaavan.
Kun aikakatkaisu tapahtuu, kutsu palauttaa nil-arvon ja merkkijonon "timeout". Asettakaa tuotannossa aina aikakatkaisu, jotta yhteydet eivät jää jumiin.
conn:settimeout(5)
local data, err = conn:receive("*l")
if err == "timeout" then print("too slow") endTCP vai UDP
TCP on yhteyspohjainen, järjestyksen säilyttävä ja luotettava: tavut saapuvat kerran ja oikeassa järjestyksessä, mutta tämä edellyttää kättelyjä ja uudelleenlähetyksiä.
UDP (socket.udp()) on yhteydetön ja epäluotettava mutta kevyt, joten se sopii hyvin telemetriaan tai peleihin. Tällä kurssilla keskitytään TCP:hen, koska HTTP perustuu siihen.
Osittaiset lähetykset ja silmukat
Ei-estävissä socketeissa send saattaa lähettää puskuristasi vain osan. Se palauttaa nil, "timeout" sekä tähän mennessä kirjoitetun viimeisen tavun indeksin.
Vankka lähettäjä käyttää silmukkaa ja jatkaa viimeksi lähetettyä tavua seuraavasta tavusta, kunnes koko puskuri on lähetetty.
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
endYhteyden tarkasteleminen
conn:getpeername() palauttaa etä-IP-osoitteen ja portin, kun taas conn:getsockname() palauttaa paikallisen pään tiedot. Näistä on apua lokituksessa ja virheenkorjauksessa.
conn:setoption("keepalive", true) ja conn:setoption("tcp-nodelay", true) säätävät taustalla olevan socketin toimintaa.
local ip, port = conn:getpeername()
print("connected to", ip, port)
conn:setoption("tcp-nodelay", true)Pikatesti
Testatkaa ymmärrystänne TCP:n vastaanottosemantiikasta.
Kertaus
Olette tutustuneet LuaSocketin TCP-master-objektiin, oppineet luomaan, yhdistämään, lähettämään, vastaanottamaan ja sulkemaan socketeja sekä nähneet, miten aikakatkaisut ja puoliksi sulkeminen vaikuttavat toimintaan.
Muistakaa, että TCP on tavujono, jokainen kutsu voi palauttaa nil, err ja tuotannossa käytettävälle socketille asetetaan aina aikakatkaisu. Seuraavaksi kokoatte nämä osat toimivaksi asiakkaaksi.
Opi Lua tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 40
- Oppitunnit
- 159
Usein kysytyt kysymykset
Onko oppitunti ”TCP:n perusteet” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “TCP:n perusteet”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Lua Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”TCP:n perusteet”?
Muodostakaa yhteys ja lähettäkää dataa. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Lua Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”TCP:n perusteet”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Lua Academy-oppitunnilla?
Kyllä. Jokainen Lua Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- TCP:n perusteet
- Asiakkaan rakentaminen
- Palvelimen rakentaminen
- HTTP-pyynnöt