WebSocket — un protocol de comunicare full-duplex care asigură o conexiune permanentă între client și server pentru schimbul de date în timp real. Spre deosebire de solicitările HTTP tradiționale, acest protocol stabilește o singură conexiune și o utilizează pentru transmisia bidirecțională fără handshake-uri repetate. Conform Mozilla Developer Network (2025), WebSocket reduce întârzierile cu până la 50% comparativ cu HTTP polling în aplicațiile în timp real.
Principalele puncte
WebSocket — este un protocol de comunicare care funcționează peste TCP și asigură un canal full-duplex între client și server. A fost standardizat de IETF ca RFC 6455 în 2011 și este suportat de toate browserele moderne, platformele mobile și framework-urile server.
Spre deosebire de HTTP, unde clientul inițiază o solicitare și primește un răspuns, WebSocket permite ambelor părți să trimită mesaje în orice moment după stabilirea conexiunii. Acest lucru îl face ideal pentru scenarii care necesită livrare instantanee a datelor: chat-uri, notificări, editare colaborativă a documentelor.
Protocolul WebSocket utilizează portul HTTP 80 sau portul HTTPS 443 pentru handshake-ul inițial, după care comută la propriul protocol cu un antet minimal — doar 2 octeți în loc de 800+ octeți în HTTP. Această caracteristică oferă un avantaj semnificativ de performanță la un număr mare de mesaje.
Conexiunea WebSocket începe cu o solicitare HTTP Upgrade, după care protocolul comută la formatul binar de frame-uri. Dimensiunea frame-ului variază de la 2 octeți la 2^63 octeți, permițând transmiterea atât a mesajelor text scurte, cât și a datelor binare mari. Sunt suportate fragmentarea mesajelor, mascarea datelor de la client la server și ping/pong pentru menținerea conexiunii.
Procesul de stabilire a conexiunii WebSocket constă din două etape: handshake și transmiterea datelor. În etapa de handshake, clientul trimite o solicitare HTTP cu antetul Upgrade: websocket, iar serverul confirmă comutarea protocolului cu statusul 101 Switching Protocols. După aceasta, conexiunea trece în modul de transmisie full-duplex.
Fiecare mesaj în WebSocket este împărțit în frame-uri. Frame-ul conține opcode (text, date binare, închidere, ping/pong), lungimea payload-ului și cheia de mascare pentru datele de la client. Frame-ul poate fi fragmentat — frame-urile de control (ping/pong) pot fi transmise între fragmentele mesajului, prevenind întreruperea conexiunii în timpul transmisiei lungi.
const ws = new WebSocket('wss://example.com/chat')
ws.addEventListener('open', () => {
console.log('Conexiune stabilită')
ws.send('Salut, server!')
})
ws.addEventListener('message', (event) => {
console.log('Primit:', event.data)
})
ws.addEventListener('close', () => {
console.log('Conexiune închisă')
})
În exemplul de mai sus, clientul creează un obiect WebSocket, specificând URL-ul securizat wss://. După deschiderea conexiunii, se trimite un mesaj de salut, iar handler-ul message primește răspunsurile de la server. La închidere, se activează handler-ul close — acest lucru este important pentru reconectare în caz de întrerupere a rețelei.
Diferența principală între WebSocket și HTTP constă în modelul de interacțiune. HTTP funcționează după schema solicitare-răspuns: clientul inițiază solicitarea, serverul returnează răspunsul, conexiunea se închide. WebSocket, în schimb, stabilește un canal permanent prin care ambele părți pot iniția transmisia în orice moment.
Pentru aplicațiile care necesită întârziere redusă și flux constant de date, WebSocket este semnificativ mai eficient. HTTP Long Polling — alternativa în care serverul menține solicitarea deschisă până la apariția datelor — creează o sarcină suplimentară asupra serverului și crește consumul de memorie din cauza numărului mare de conexiuni simultane.
| Parametru | WebSocket | HTTP |
|---|---|---|
| Model | Full-duplex | Solicitare-răspuns |
| Antet | 2–14 octeți | 400–800 octeți |
| Conexiune permanentă | Da, una | Nu, nouă la fiecare solicitare |
| Latență | Redusă (1–5 ms) | Ridicată (50–200 ms) |
| Protocol | ws:// sau wss:// | http:// sau https:// |
Conform High Performance Browser Networking (Grigorik, O’Reilly), WebSocket reduce întârzierile de rețea în scenariile în timp real cu 40–60% comparativ cu HTTP Long Polling, iar sarcina serverului scade de 3–5 ori datorită eliminării handshake-urilor repetate.
Datorită latenței reduse și comunicării bidirecționale, WebSocket este utilizat într-o gamă largă de aplicații. Scenariile cheie includ schimbul instantaneu de mesaje, sincronizarea stării în jocuri și transmiterea datelor de piață în sistemele financiare.
WebSocket a devenit standardul de facto pentru aplicațiile de chat. Platforme precum Slack, Telegram Web și WhatsApp Web utilizează WebSocket pentru livrarea instantanee a mesajelor. Protocolul permite trimiterea atât a mesajelor text, cât și a fișierelor printr-un singur canal, iar mecanismul ping/pong menține conexiunea activă chiar și în lipsa activității.
Jocurile multiplayer pentru browser și mobile necesită o latență minimă pentru sincronizarea stării jucătorilor. WebSocket transmite coordonatele, acțiunile și evenimentele în timp real fără întârzierile solicitărilor HTTP. Framework-uri precum Socket.IO și Colyseus abstrage munca la nivel jos cu protocolul, adăugând reconectare automată și camere.
Terminalele bursiere și platformele de tranzacționare utilizează WebSocket pentru recepționarea cotațiilor în timp real. O întârziere de câteva milisecunde poate costa milioane de dolari, motiv pentru care API-urile financiare — de exemplu, Binance WebSocket Streams, Coinbase Pro — oferă interfețe WebSocket pentru datele de piață.
În dezvoltarea mobilă, WebSocket este utilizat prin API-uri native: URLSessionWebSocketTask pe iOS și OkHttp WebSocket pe Android. Pentru Flutter există biblioteca web_socket_channel, iar pentru React Native — react-native-websocket. Dispozitivele IoT folosesc WebSocket pentru transmiterea telemetriei și primirea comenzilor de control, deoarece protocolul consumă mai puțină energie decât HTTP-polling-ul constant.
Să examinăm un exemplu al părții server în Node.js cu biblioteca ws — cea mai populară implementare WebSocket pentru JavaScript. Serverul acceptă conexiuni, procesează mesaje și le difuzează către toți clienții conectați.
const WebSocket = require('ws')
const wss = new WebSocket.Server({ port: 8080 })
wss.on('connection', (ws) => {
console.log('Client nou conectat')
ws.on('message', (data) => {
console.log('Primit:', data.toString())
ws.send('Serverul a primit mesajul dvs.')
})
ws.on('close', () => {
console.log('Client deconectat')
})
})
console.log('Serverul WebSocket pornit pe portul 8080')
Serverul creează o instanță WebSocket.Server pe portul 8080 și așteaptă conexiuni. Fiecărui client nou îi este atribuit un obiect ws separat, prin care serverul poate trimite mesaje individual. Difuzarea mesajelor către toți clienții se realizează prin parcurgerea în masă a matricei de conexiuni. La un număr mare de clienți (peste 1000) se recomandă utilizarea bibliotecilor cu suport pentru clustering, precum Socket.IO, care adaugă scalare prin Redis și reconectare automată.
wss.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) {
client.send('Mesaj pentru toți participanții')
}
})
Verificarea readyState înainte de trimitere este obligatorie: dacă clientul s-a deconectat deja, apelul send va genera o eroare. Steagul WebSocket.OPEN garantează că conexiunea este activă și mesajul va fi livrat.
Pentru aplicațiile iOS mobile, WebSocket este implementat prin URLSessionWebSocketTask, disponibil din iOS 13. Sesiunea creează o sarcină cu URL-ul protocolului wss://, după care sunt apelate metodele send și receive. Recepționarea mesajelor poate fi organizată prin recursivitatea continuă a receive, care așteaptă următorul mesaj după procesarea precedentului, asigurând recepția continuă a datelor fără reconectare. Pentru Android se utilizează OkHttp WebSocket, care oferă o interfață similară cu callback-uri onOpen, onMessage, onClosing și onClosed, precum și reconectare automată la întreruperea conexiunii.
La lucrul cu WebSocket în aplicațiile mobile, este important să se ia în considerare gestionarea ciclului de viață: la trecerea aplicației în fundal, conexiunea poate fi întreruptă de sistem. Pe iOS, este necesar să se restabilească conexiunea la revenirea în prim-plan prin delegatul sceneDidBecomeActive. Pe Android, trebuie utilizate componente Lifecycle-aware sau Service pentru menținerea conexiunii. În plus, se recomandă implementarea exponential backoff la reconectare — creșterea intervalului între încercări de la 1 la 30 de secunde, pentru a nu crea o sarcină excesivă asupra serverului în cazul problemelor temporare de rețea.
Întrebări frecvente
WebSocket stabilește o conexiune permanentă full-duplex prin care ambele părți pot trimite date în orice moment. HTTP funcționează după schema solicitare-răspuns, unde fiecare schimb necesită o nouă conexiune și antete complete. WebSocket utilizează un singur canal TCP și antete de doar 2–14 octeți, ceea ce reduce radical întârzierile.
WebSocket utilizează portul 80 pentru conexiuni nesecurizate (ws://) și portul 443 pentru conexiuni securizate (wss://). Acest lucru permite trecerea prin majoritatea serverelor proxy și firewall-urilor corporative fără configurare suplimentară. Portul 443 este recomandat pentru mediile de producție datorită criptării TLS.
Da, WebSocket este suportat pe toate platformele mobile. În iOS, clasa nativă URLSessionWebSocketTask este disponibilă din iOS 13. În Android — clasa OkHttp WebSocket și java.net.WebSocket standard. Pentru React Native există biblioteca react-native-websocket.
WebSocket Secure — versiunea securizată a protocolului care funcționează peste TLS. Toate datele sunt criptate la fel ca în HTTPS. WSS este obligatoriu pentru aplicațiile de producție, în special la transmiterea token-urilor de autentificare sau a datelor personale prin WebSocket.
Principalele alternative: HTTP Long Polling (serverul menține solicitarea deschisă), Server-Sent Events (flux unidirecțional de la server) și WebRTC Data Channel (comunicare peer-to-peer). Server-Sent Events sunt mai simple de implementat, dar nu suportă trimiterea de la client la server.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și