WebSocket este o tehnologie integrală în multe aplicații web moderne. Dacă scrieți cod pentru web, probabil că ați mai auzit termenul, dar poate că nu sunteți sigur ce este exact sau cum să îl utilizați. Din fericire, WebSocket nu este un concept complex și puteți obține o înțelegere de bază a acestuia destul de repede.

Ce este WebSocket?

WebSocket, din păcate, este unul dintre acele nume care nu pare să aibă sens la prima vedere. WebSocket este de fapt numele unui protocol de comunicare care permite comunicarea bidirecțională între client și serverul web.

În termeni mai simpli, WebSocket este o tehnologie care permite unui client și unui server să creeze o conexiune în care oricare dintre părți poate trimite celeilalte un mesaj în orice moment.

Aceasta este diferită de o conexiune HTTP obișnuită, în care clientul trebuie să inițieze o solicitare și numai atunci serverul poate trimite un răspuns. De fapt, WebSocket este un protocol de comunicare complet diferit de HTTP, care a fost conceput pentru a fi compatibil cu HTTP. Când o aplicație client dorește să inițieze o conexiune WebSocket, trebuie să folosească

instagram viewer
Mecanism de upgrade HTTP pentru a comuta la protocolul WebSocket.

În acest moment, s-ar putea să vă gândiți: „un protocol este doar un set de reguli, cum îl puteți folosi pentru a codifica?”.

Piesa lipsă este ceva numit a stiva de protocoale. În esență, dispozitivele care acceptă un protocol au hardware și software integrat care vă permit să scrieți aplicații care comunică folosind protocolul. Protocolul nu este folosit direct pentru a construi nimic.

De ce a fost creat WebSocket?

Pentru a ilustra necesitatea WebSocket, luați în considerare mecanismul din spatele conversației pe internet.

Cineva trimite un mesaj către serverul de chat de pe dispozitivul său, dar serverul trebuie să trimită acel mesaj pe dispozitivul tău înainte ca tu să-l poți citi. Dacă serverul folosește HTTP, serverul nu vă poate redirecționa direct acel mesaj, deoarece serverul nu poate iniția solicitări.

Există câteva moduri de a remedia această problemă cu HTTP. O modalitate este ca clientul să trimită în mod constant cereri de actualizare către server, iar serverul va transmite orice date pe care le are în răspuns. Această tehnică se numește sondaj, iar fiecare cerere se numește sondaj. Există două variante de sondaj: sondaj lung și sondaj scurt.

Utilizarea variantei de interogare lungă înseamnă că dispozitivul client întreabă în mod constant serverul dacă sunt disponibile mesaje noi. Dacă sunt disponibile mesaje noi, serverul va trimite mesajele ca răspuns. Dacă nu, serverul ar întârzia răspunsul și ar menține conexiunea deschisă până când ar avea date de trimis înapoi, iar apoi clientul ar face imediat o nouă solicitare.

Această tehnică este ineficientă, deoarece HTTP nu a fost conceput pentru a fi utilizat în acest fel. Funcționează adecvat la scară mică, dar fiecare solicitare HTTP implică trimiterea de date suplimentare în antet și are ca rezultat o încărcare semnificativ crescută pe server atunci când mulți clienți interogează aceasta.

Iată o diagramă care ilustrează sondajul lung:

Varianta de sondaj scurt este și mai puțin eficientă. Pe scurt, serverul nu ține conexiunea deschisă până când sunt date noi, ceea ce înseamnă că clientul trebuie să continue să interogheze serverul la intervale fixe, foarte scurte.

O altă tehnică de comunicare bidirecțională în HTTP se numește streaming.

În streaming, după ce prima solicitare este trimisă, serverul menține conexiunea deschisă la nesfârșit, trimițând noi informații ca răspunsuri parțiale continue către client.

Folosirea fluxului are ca rezultat o supraîncărcare a datelor și a serverului mai mici decât sondajul, deoarece, în mod ideal, clientul face o singură solicitare HTTP. Din păcate, streamingul creează probleme în anumite condiții, deoarece browserele și intermediarii de rețea (cum ar fi proxy-urile) încearcă adesea să gestioneze răspunsurile parțiale ca bucăți rupte dintr-un răspuns HTTP mare (care este un comportament HTTP normal), în loc de mesajele separate pe care trebuiau să le fi.

WebSocket a fost creat pentru a rezolva aceste probleme. Spre deosebire de HTTP, WebSocket a fost conceput special pentru comunicarea bidirecțională. Cu WebSocket, odată ce o conexiune este deschisă, clientul și serverul pot trimite mesaje înainte și înapoi fără probleme de sondare sau streaming.

Cazuri de utilizare pentru WebSocket

WebSocket este grozav, dar asta nu înseamnă că ar trebui folosit peste tot.

Implementarea WebSocket poate adăuga complexitate aplicației dvs., în special pe partea serverului, așa că nu ar trebui făcută decât dacă aveți un motiv întemeiat. Asta ridică întrebarea: cum arată un motiv bun?

WebSocket este ideal pentru cazurile de utilizare în care este necesară o comunicare bidirecțională frecventă la latență scăzută. Cu alte cuvinte, WebSocket oferă un avantaj pentru aplicațiile care trebuie să comunice frecvent sau la scară largă. Dacă comunicarea nu trebuie să fie în timp real sau aplicația nu va crește niciodată la scară mare, sondarea sau transmiterea în flux pot fi suficiente pentru a fi utilizate în aplicația respectivă.

Utilizările tipice ale WebSocket sunt în construirea de aplicații de chat, jocuri online multiplayer, colaborare în timp real și software de notificare etc.

Cum să utilizați WebSocket pe partea client

Utilizarea WebSocket pe partea de server poate fi destul de implicată, iar procesul variază substanțial în funcție de limbă (cum ar fi C#, Java, etc.) și biblioteca la alegere, așa că nu o vom acoperi aici. În continuare, vom discuta pe scurt cum să folosiți WebSocket pe partea client.

Toate browserele moderne implementează un API web numit API-ul WebSocket, care este stiva de protocoale a browserului pentru protocolul WebSocket. Puteți utiliza WebSocket în JavaScript folosind acest API. API-ul vă permite să creați un obiect WebSocket, prin care creați o conexiune WebSocket și interacționați cu serverul WebSocket.

Puteți utiliza următorul format de cod pentru a crea un obiect WebSocket:

lasă exampleSocket = new WebSocket("wss://www.example.com/socketserver", "dummyProtocol");

Primul argument pentru constructor este URI-ul serverului WebSocket cu care doriți să creați o conexiune. Va începe întotdeauna cu „ws” sau „wss”. Al doilea argument este opțional. Valoarea sa este fie un șir, fie o matrice de șiruri, care specifică subprotocoalele pe care le suportați.

Obiectul WebSocket are o proprietate de numai citire numită readyState. Accesarea acestei proprietăți oferă starea curentă a conexiunii WebSocket. readyState are patru valori posibile: „conectare”, „deschis”, „închidere” și „închis”.

Când acea linie de cod rulează, browserul va încerca să se conecteze la serverul specificat. Conexiunea nu va fi finalizată imediat, așa că readyState of exampleSocket se va „conecta”. Niciun mesaj nu poate fi trimis sau primit până la finalizarea conexiunii, moment în care valoarea readyState va deveni „deschisă”.

The exempluSocket obiectul are un ascultător de evenimente (care este diferit de Ascultători de evenimente DOM) numit „onopen” care vă permite să efectuați acțiuni ulterioare numai după ce conexiunea a fost stabilită. Obiectul are, de asemenea, o metodă „send” care vă permite să trimiteți șiruri de caractere, Blob-uri (date binare) și ArrayBuffers ca mesaje către server.

Iată un exemplu folosind acestea împreună:

exampleSocket.onopen = funcţie (eveniment) {
exampleSocket.send("WebSocket este foarte tare");
};

API-ul vă oferă, de asemenea, o modalitate de a putea reacționa la mesajele pe care le trimite serverul. Acest lucru se face cu ascultătorul de evenimente „onmessage”. Iată un exemplu:

exampleSocket.onmessage = funcţie (eveniment) {
consolă.Buturuga(eveniment.date);
}

În schimb, poți și să scrii o funcție săgeată:

exampleSocket.onmessage = (eveniment) => { consolă.log (eveniment.date); }

API-ul oferă, de asemenea, un închide() metoda de a închide conexiunea. Iată cum arată:

exempluSocket.închide();

WebSocket permite comunicarea bidirecțională eficientă

WebSocket este un protocol de comunicații bidirecțional. Serverele și browserele implementează stive de protocoale pentru a comunica folosind WebSocket. WebSocket există deoarece HTTP nu a fost conceput pentru a fi bidirecțional. Există metode de implementare a conexiunilor bidirecționale cu HTTP, dar au probleme.

WebSocket este o tehnologie puternică, dar nu este necesară în toate cazurile, deoarece poate complica semnificativ arhitectura aplicației. Utilizarea WebSocket pe partea client se face cu browser-ul WebSocket API.