WebSocket on olennainen tekniikka monissa nykyaikaisissa verkkosovelluksissa. Jos kirjoitat koodia verkkoon, olet luultavasti kuullut termin aiemmin, mutta et ehkä ole varma, mikä se tarkalleen on tai miten sitä käytetään. Onneksi WebSocket ei ole monimutkainen käsite, ja voit saada sen perusymmärryksen melko nopeasti.
Mikä on WebSocket?
WebSocket on valitettavasti yksi niistä nimistä, jotka eivät vaikuta järkevältä ensi silmäyksellä. WebSocket on itse asiassa nimi a viestintäprotokolla joka mahdollistaa kaksisuuntaisen viestinnän asiakkaan ja web-palvelimen välillä.
Yksinkertaisemmin sanottuna WebSocket on tekniikka, jonka avulla asiakas ja palvelin voivat luoda yhteyden, jossa kumpi tahansa osapuoli voi lähettää toiselle viestin milloin tahansa.
Tämä eroaa tavallisesta HTTP-yhteydestä, jossa asiakkaan on aloitettava pyyntö ja vasta sitten palvelin voi lähettää vastauksen. Itse asiassa WebSocket on täysin erilainen viestintäprotokolla kuin HTTP, joka on suunniteltu HTTP-yhteensopivaksi. Kun asiakassovellus haluaa muodostaa WebSocket-yhteyden, sen on käytettävä
HTTP-päivitysmekanismi vaihtaaksesi WebSocket-protokollaan.Tässä vaiheessa saatat ajatella: "Protokolla on vain joukko sääntöjä, kuinka voit käyttää sitä koodaamiseen?".
Puuttuva pala on jotain nimeltä a protokollapino. Pohjimmiltaan protokollaa tukevissa laitteissa on sisäänrakennettu laitteisto ja ohjelmisto, joiden avulla voit kirjoittaa sovelluksia, jotka kommunikoivat protokollan avulla. Protokollaa ei käytetä suoraan minkään rakentamiseen.
Miksi WebSocket luotiin?
Havainnollistaaksesi WebSocketin tarvetta, harkitse Internet-keskustelun takana olevaa mekanismia.
Joku lähettää viestin chat-palvelimelle laitteestaan, mutta palvelimen on silti lähetettävä viesti laitteellesi, ennen kuin voit lukea sen. Jos palvelin käyttää HTTP: tä, palvelin ei voi lähettää viestiä suoraan sinulle, koska palvelin ei voi aloittaa pyyntöjä.
On olemassa pari tapaa korjata tämä ongelma HTTP: n avulla. Yksi tapa on, että asiakas lähettää jatkuvasti päivityspyyntöjä palvelimelle, ja palvelin välittää kaikki vastauksessa olevat tiedot. Tätä tekniikkaa kutsutaan kyselyksi, ja jokaista pyyntöä kutsutaan kyselyksi. Äänestystä on kaksi: pitkä kysely ja lyhyt kysely.
Pitkän kyselyn muunnelman käyttäminen tarkoittaa, että asiakaslaite kysyy jatkuvasti palvelimelta, onko uusia viestejä saatavilla. Jos uusia viestejä on saatavilla, palvelin lähettää viestit vastauksena. Jos ei, palvelin viivästyisi vastaamista ja piti yhteyttä auki, kunnes sillä oli takaisin lähetettävää dataa, ja sitten asiakas tekisi välittömästi uuden pyynnön.
Tämä tekniikka on tehoton, koska HTTP: tä ei ole suunniteltu käytettäväksi tällä tavalla. Se toimii riittävästi pienessä mittakaavassa, mutta jokainen HTTP-pyyntö sisältää ylimääräisten tietojen lähettämisen otsikko, ja se lisää merkittävästi palvelimen kuormitusta, kun monet asiakkaat pollaavat se.
Tässä kaavio, joka havainnollistaa pitkää kyselyä:
Lyhyen kyselyn variantti on vielä vähemmän tehokas. Lyhyessä kyselyssä palvelin ei pidä yhteyttä auki ennen kuin on uutta tietoa, mikä tarkoittaa, että asiakkaan on jatkettava kyselyä palvelimelta kiintein, hyvin lyhyin väliajoin.
Toista kaksisuuntaista tekniikkaa HTTP: ssä kutsutaan suoratoistoksi.
Suoratoistossa ensimmäisen pyynnön lähettämisen jälkeen palvelin pitää yhteyttä auki toistaiseksi ja lähettää uusia tietoja jatkuvina osittaisina vastauksina asiakkaalle.
Suoratoiston käyttäminen johtaa pienempään tiedonsiirtoon ja palvelimen kuormitukseen kuin pollaus, koska ihannetapauksessa asiakas tekee vain yhden HTTP-pyynnön. Valitettavasti suoratoisto aiheuttaa ongelmia tietyissä olosuhteissa, koska selaimet ja verkon välittäjät (kuten välityspalvelimet) yrittävät usein käsitellä osittaiset vastaukset yhden suuren HTTP-vastauksen katkelmina (joka on normaali HTTP-käyttäytyminen), sen sijaan, että ne olisivat erilliset viestit olla.
WebSocket luotiin ratkaisemaan nämä ongelmat. Toisin kuin HTTP, WebSocket on suunniteltu erityisesti kaksisuuntaiseen viestintään. WebSocketilla, kun yhteys on avattu, asiakas ja palvelin voivat lähettää viestejä edestakaisin ilman pollaus- tai suoratoistoongelmia.
Käytä WebSocketin koteloita
WebSocket on hieno, mutta se ei tarkoita, että sitä pitäisi käyttää kaikkialla.
WebSocketin käyttöönotto voi monimutkaistaa sovellustasi erityisesti palvelinpuolella, joten sitä ei pidä tehdä, ellei sinulla ole hyvää syytä. Tämä herättää kysymyksen: miltä hyvä syy näyttää?
WebSocket on ihanteellinen käyttötapauksiin, joissa tarvitaan toistuvaa kaksisuuntaista viestintää alhaisella latenssilla. Toisin sanoen WebSocket tarjoaa edun sovelluksille, joiden on kommunikoitava usein tai suuressa mittakaavassa. Jos viestinnän ei tarvitse olla reaaliaikaista tai sovellus ei koskaan kasva suureksi mittakaavaksi, kysely tai suoratoisto saattaa riittää käytettäväksi kyseisessä sovelluksessa.
WebSocketin tyypillisiä käyttötarkoituksia ovat chat-sovellusten rakentaminen, online-moninpelit, reaaliaikainen yhteistyö ja ilmoitusohjelmistot jne.
WebSocketin käyttäminen asiakaspuolella
WebSocketin käyttäminen palvelinpuolella voi olla melko haastavaa, ja prosessi vaihtelee huomattavasti kielen mukaan (esim. C#, Javajne.) ja valitsemaasi kirjastoon, joten emme käsittele sitä tässä. Seuraavaksi keskustelemme lyhyesti WebSocketin käytöstä asiakaspuolella.
Kaikki nykyaikaiset selaimet käyttävät verkkosovellusliittymää nimeltä WebSocket API, joka on selaimen protokollapino WebSocket-protokollalle. Voit käyttää WebSocketia JavaScriptissä tämän API: n avulla. API: n avulla voit luoda WebSocket-objektin, jonka kautta voit luoda WebSocket-yhteyden ja olla vuorovaikutuksessa WebSocket-palvelimen kanssa.
Voit käyttää WebSocket-objektin luomiseen seuraavaa koodimuotoa:
anna esimerkkiSocket = new WebSocket("wss://www.example.com/socketserver", "dummy-protokolla");
Ensimmäinen konstruktorin argumentti on sen WebSocket-palvelimen URI, johon haluat luoda yhteyden. Se alkaa aina kirjaimella "ws" tai "wss". Toinen argumentti on valinnainen. Sen arvo on joko merkkijono tai merkkijonojoukko, joka määrittää tukemasi aliprotokollat.
WebSocket-objektilla on vain luku -ominaisuus nimeltä readyState. Tämän ominaisuuden käyttäminen näyttää WebSocket-yhteyden nykyisen tilan. readyState on neljä mahdollista arvoa: "connecting", "open", "closing" ja "closed".
Kun tämä koodirivi suoritetaan, selain yrittää muodostaa yhteyden määritettyyn palvelimeen. Yhteyttä ei saada valmiiksi heti, joten esimerkkiSocketin readyState on "yhdistetään". Viestejä ei voida lähettää tai vastaanottaa ennen kuin yhteys on valmis, jolloin readyStaten arvosta tulee "open".
The esimerkkiSocket objektilla on tapahtuman kuuntelija (joka eroaa DOM-tapahtuman kuuntelijat) nimeltä "onopen", jonka avulla voit suorittaa lisätoimintoja vasta yhteyden muodostamisen jälkeen. Objektissa on myös "lähetä"-menetelmä, jonka avulla voit lähettää merkkijonoja, blobeja (binääritietoja) ja ArrayBuffereja viesteinä palvelimelle.
Tässä on esimerkki näiden käyttämisestä yhdessä:
esimerkkiSocket.onopen = toiminto (tapahtuma) {
exampleSocket.send("WebSocket on todella siistiä");
};
API tarjoaa myös tavan, jolla voit reagoida palvelimen lähettämiin viesteihin. Tämä tehdään "onmessage"-tapahtuman kuuntelijalla. Tässä on esimerkki:
esimerkkiSocket.onmessage = toiminto (tapahtuma) {
konsoli.Hirsi(tapahtuma.data);
}
Sen sijaan voit myös kirjoittaa nuolitoiminto:
exampleSocket.onmessage = (tapahtuma) => { konsoli.log (tapahtuma.data); }
API tarjoaa myös a kiinni() tapa sulkea yhteys. Tältä se näyttää:
esimerkkiSocket.kiinni();
WebSocket mahdollistaa tehokkaan kaksisuuntaisen viestinnän
WebSocket on kaksisuuntainen viestintäprotokolla. Palvelimet ja selaimet toteuttavat protokollapinoja viestiäkseen WebSocketin avulla. WebSocket on olemassa, koska HTTP: tä ei ole suunniteltu kaksisuuntaiseksi. On olemassa menetelmiä kaksisuuntaisten yhteyksien toteuttamiseen HTTP: n avulla, mutta niissä on ongelmia.
WebSocket on tehokas tekniikka, mutta se ei ole välttämätöntä kaikissa tapauksissa, koska se voi monimutkaistaa sovellusarkkitehtuuria merkittävästi. WebSocketin käyttö asiakaspuolella tapahtuu selaimen WebSocket API: lla.