A WebSocket számos modern webalkalmazás szerves része. Ha kódot ír az internetre, valószínűleg hallotta már ezt a kifejezést, de talán nem tudja pontosan, mi az, vagy hogyan kell használni. Szerencsére a WebSocket nem egy bonyolult fogalom, és elég gyorsan meg lehet érteni vele az alapvető ismereteket.
Mi az a WebSocket?
A WebSocket sajnos egyike azoknak a neveknek, amelyek első pillantásra nem tűnnek értelmesnek. A WebSocket valójában a neve kommunikációs protokoll amely lehetővé teszi a kétirányú kommunikációt a kliens és a webszerver között.
Egyszerűbben fogalmazva, a WebSocket egy olyan technológia, amely lehetővé teszi a kliens és a szerver számára, hogy kapcsolatot hozzon létre, ahol bármelyik fél bármikor üzenetet küldhet a másiknak.
Ez eltér a szokásos HTTP kapcsolattól, ahol a kliensnek kell kezdeményeznie egy kérést, és a szerver csak ezután küldhet választ. Valójában a WebSocket egy teljesen más kommunikációs protokoll, mint a HTTP, amelyet HTTP-kompatibilisnek terveztek. Ha egy ügyfélalkalmazás WebSocket kapcsolatot kíván kezdeményezni, akkor használnia kell a
HTTP frissítési mechanizmus hogy váltson a WebSocket protokollra.Ezen a ponton azt gondolhatja: "a protokoll csak egy szabálykészlet, hogyan használhatja ezt a kódoláshoz?".
A hiányzó darab az úgynevezett a protokoll verem. Lényegében a protokollt támogató eszközök beépített hardverrel és szoftverrel rendelkeznek, amelyek lehetővé teszik a protokoll használatával kommunikáló alkalmazások írását. A protokollt közvetlenül nem használják semmi felépítésére.
Miért jött létre a WebSocket?
A WebSocket szükségességének szemléltetéséhez vegye figyelembe az internetes csevegés mögött meghúzódó mechanizmust.
Valaki üzenetet küld a csevegőszervernek az eszközéről, de a szervernek továbbra is el kell küldenie az üzenetet az Ön eszközére, mielőtt elolvashatja. Ha a szerver HTTP-t használ, a szerver nem tudja közvetlenül továbbítani az üzenetet Önnek, mert a szerver nem tud kéréseket kezdeményezni.
A HTTP-vel több módon is megoldható ez a probléma. Az egyik módja az, hogy a kliens folyamatosan frissítési kéréseket küld a szervernek, és a szerver továbbítja a válaszban szereplő adatokat. Ezt a technikát lekérdezésnek nevezik, és minden kérést lekérdezésnek neveznek. A szavazásnak két változata van: hosszú lekérdezés és rövid szavazás.
A hosszú lekérdezési változat használata azt jelenti, hogy a kliens eszköz folyamatosan megkérdezi a szervert, hogy elérhetők-e új üzenetek. Ha új üzenetek állnak rendelkezésre, a szerver válaszként elküldi az üzeneteket. Ha nem, a kiszolgáló késlelteti a választ, és nyitva tartja a kapcsolatot, amíg nincs visszaküldendő adat, majd a kliens azonnal új kérést küld.
Ez a technika nem hatékony, mert a HTTP-t nem úgy tervezték, hogy így használják. Kis léptékben megfelelően működik, de minden HTTP-kérelem extra adatok küldésével jár fejléc, és ez jelentősen megnöveli a szerver terhelését, amikor sok kliens lekérdez azt.
Íme egy diagram, amely a hosszú szavazást illusztrálja:
A rövid lekérdezési változat még kevésbé hatékony. Rövid lekérdezés esetén a szerver nem tartja nyitva a kapcsolatot, amíg új adatok nem érkeznek, vagyis az ügyfélnek fix, nagyon rövid időközönként kell lekérdeznie a szervert.
A kétirányú kommunikáció másik technikáját a HTTP-ben streamingnek nevezik.
A streaming során az első kérés elküldése után a szerver korlátlan ideig nyitva tartja a kapcsolatot, folyamatos részválaszként újabb információkat küldve a kliensnek.
A streaming használata kisebb adatterhelést és szerverterhelést eredményez, mint a lekérdezés, mivel ideális esetben a kliens csak egy HTTP-kérést küld. Sajnos a streamelés bizonyos körülmények között problémákat okoz, mivel a böngészők és a hálózati közvetítők (például a proxy) gyakran megpróbálják kezelni a részleges válaszok egyetlen nagy HTTP-válasz töredékeiként (ami normális HTTP-viselkedés), nem pedig külön üzenetként lenni.
A WebSocket ezen problémák megoldására jött létre. A HTTP-vel ellentétben a WebSocket kifejezetten kétirányú kommunikációra készült. A WebSocket segítségével a kapcsolat megnyitása után a kliens és a kiszolgáló oda-vissza küldhet üzeneteket lekérdezés vagy streaming probléma nélkül.
Használja a WebSocket eseteit
A WebSocket nagyszerű, de ez nem jelenti azt, hogy mindenhol használni kell.
A WebSocket megvalósítása bonyolultabbá teheti az alkalmazást, különösen a szerver oldalon, ezért ezt nem szabad megtenni, hacsak nincs jó oka. Ez felveti a kérdést: hogyan néz ki a jó ok?
A WebSocket ideális olyan esetekben, amikor alacsony késleltetés mellett gyakori kétirányú kommunikációra van szükség. Más szóval, a WebSocket előnyt biztosít azon alkalmazások számára, amelyeknek gyakran vagy nagy léptékű kommunikációra van szükségük. Ha a kommunikációnak nem kell valós idejűnek lennie, vagy az alkalmazás soha nem fog nagy léptékűvé válni, a lekérdezés vagy a streamelés elegendő lehet az alkalmazásban való használatra.
A WebSocket tipikus felhasználási területei csevegőalkalmazások, online többjátékos játékok, valós idejű együttműködési és értesítési szoftverek stb.
A WebSocket használata kliens oldalon
A WebSocket kiszolgálóoldali használata meglehetősen bonyolult lehet, és a folyamat jelentősen változik a nyelvtől függően (pl. C#, Jáva, stb.) és a választott könyvtár, ezért itt nem térünk ki rá. Ezután röviden megvitatjuk a WebSocket ügyféloldali használatát.
Minden modern böngésző megvalósít egy webes API-t, az úgynevezett WebSocket API, amely a böngésző protokoll verem a WebSocket protokollhoz. Ezzel az API-val használhatja a WebSocketet JavaScriptben. Az API lehetővé teszi egy WebSocket objektum létrehozását, amelyen keresztül WebSocket kapcsolatot hoz létre, és interakcióba lép a WebSocket szerverrel.
WebSocket objektum létrehozásához a következő kódformátumot használhatja:
legyen exampleSocket = new WebSocket("wss://www.example.com/socketserver", "dummyProtocol");
A konstruktor első argumentuma annak a WebSocket-kiszolgálónak az URI-je, amellyel kapcsolatot kíván létrehozni. Mindig "ws" vagy "wss" karakterekkel kezdődik. A második érv nem kötelező. Értéke vagy egy karakterlánc vagy egy karakterláncok tömbje, amely meghatározza az Ön által támogatott alprotokollokat.
A WebSocket objektum csak olvasható tulajdonsággal rendelkezik readyState néven. A tulajdonság elérése megjeleníti a WebSocket kapcsolat aktuális állapotát. A readyState négy lehetséges értéket tartalmaz: "connecting", "open", "closing" és "closed".
Amikor ez a kódsor lefut, a böngésző megpróbál csatlakozni a megadott szerverhez. A kapcsolat nem fejeződik be azonnal, így az exampleSocket readyState-je „csatlakozik”. A kapcsolat létrejöttéig nem lehet üzenetet küldeni vagy fogadni, ekkor a readyState értéke "open" lesz.
Az példaSocket Az objektum eseményfigyelővel rendelkezik (amely különbözik a DOM eseményfigyelők) úgynevezett "onopen", amely csak a kapcsolat létrejötte után teszi lehetővé további műveletek végrehajtását. Az objektumnak van egy "send" metódusa is, amely lehetővé teszi karakterláncok, blobok (bináris adatok) és ArrayBuffers üzenetek küldését a kiszolgálónak.
Íme egy példa ezek együttes használatára:
exampleSocket.onopen = funkció (esemény) {
exampleSocket.send("A WebSocket nagyon klassz");
};
Az API lehetőséget biztosít arra is, hogy reagáljon a szerver által küldött üzenetekre. Ez az "onmessage" eseményfigyelővel történik. Íme egy példa:
exampleSocket.onmessage = funkció (esemény) {
konzol.log(esemény.adat);
}
Ehelyett írhatsz is egy nyíl funkciót:
exampleSocket.onmessage = (esemény) => { konzol.log (esemény.adatok); }
Az API emellett a Bezárás() módszer a kapcsolat lezárására. Így néz ki:
példaSocket.Bezárás();
A WebSocket hatékony kétirányú kommunikációt tesz lehetővé
A WebSocket egy kétirányú kommunikációs protokoll. A szerverek és a böngészők protokollveremeket valósítanak meg a WebSocket használatával történő kommunikációhoz. A WebSocket azért létezik, mert a HTTP-t nem úgy tervezték, hogy kétirányú legyen. Vannak módszerek a kétirányú kapcsolatok megvalósítására HTTP-vel, de vannak problémák.
A WebSocket hatékony technológia, de nem minden esetben szükséges, mivel jelentősen bonyolíthatja az alkalmazás architektúráját. A WebSocket kliensoldali használata a böngésző WebSocket API-jával történik.