WebSocket — protokol plně duplexní komunikace, který zajišťuje trvalé připojení mezi klientem a serverem pro výměnu dat v reálném čase. Na rozdíl od tradičních HTTP požadavků tento protokol vytváří jedno připojení a využívá ho pro obousměrný přenos bez opakovaného handshakingu. Podle Mozilla Developer Network (2025) snižuje WebSocket zpoždění až o 50% ve srovnání s HTTP pollingem v aplikacích v reálném čase.
Hlavní body
WebSocket — je komunikační protokol pracující přes TCP, který poskytuje plně duplexní kanál mezi klientem a serverem. Byl standardizován organizací IETF jako RFC 6455 v roce 2011 a je podporován všemi moderními prohlížeči, mobilními platformami a serverovými frameworky.
Na rozdíl od HTTP, kde klient iniciuje požadavek a obdrží odpověď, WebSocket umožňuje oběma stranám odesílat zprávy kdykoli po navázání spojení. To jej činí ideálním pro scénáře vyžadující okamžité doručení dat: chaty, oznámení, společné úpravy dokumentů.
Protokol WebSocket používá port HTTP 80 nebo port HTTPS 443 pro počáteční handshake, poté přepíná na vlastní protokol s minimální hlavičkou — pouhé 2 bajty namísto 800+ bajtů v HTTP. Tato vlastnost poskytuje významnou výhodu v výkonu při velkém počtu zpráv.
Připojení WebSocket začíná požadavkem HTTP Upgrade, po kterém protokol přepíná na binární formát rámců. Velikost rámce se pohybuje od 2 bajtů do 2^63 bajtů, což umožňuje přenášet jak krátké textové zprávy, tak velká binární data. Je podporována fragmentace zpráv, maskování dat od klienta k serveru a ping/pong pro udržování spojení.
Proces navazování spojení WebSocket se skládá ze dvou fází: handshake a přenos dat. Ve fázi handshake klient odešle HTTP požadavek s hlavičkou Upgrade: websocket a server potvrdí přepnutí protokolu stavem 101 Switching Protocols. Poté spojení přechází do režimu plně duplexního přenosu.
Každá zpráva v WebSocketu je rozdělena na rámce. Rámec obsahuje opcode (text, binární data, uzavření, ping/pong), délku datové části a maskovací klíč pro data od klienta. Rámec může být fragmentován — řídicí rámce (ping/pong) mohou být přenášeny mezi fragmenty zprávy, což zabraňuje přerušení spojení při dlouhém přenosu.
const ws = new WebSocket('wss://example.com/chat')
ws.addEventListener('open', () => {
console.log('Připojení navázáno')
ws.send('Ahoj servere!')
})
ws.addEventListener('message', (event) => {
console.log('Přijato:', event.data)
})
ws.addEventListener('close', () => {
console.log('Připojení uzavřeno')
})
V uvedeném příkladu klient vytvoří objekt WebSocket s uvedením zabezpečené URL wss://. Po otevření spojení je odeslána uvítací zpráva a obsluha message přijímá odpovědi od serveru. Při uzavření se aktivuje obsluha close — to je důležité pro opětovné připojení při přerušení sítě.
Hlavní rozdíl mezi WebSocketem a HTTP spočívá v modelu interakce. HTTP funguje na schématu požadavek-odpověď: klient iniciuje požadavek, server vrátí odpověď, spojení se uzavře. WebSocket naproti tomu vytváří trvalý kanál, přes který mohou obě strany iniciovat přenos kdykoli.
Pro aplikace vyžadující nízkou latenci a stálý tok dat je WebSocket výrazně efektivnější. HTTP Long Polling — alternativa, při které server drží požadavek otevřený, dokud se neobjeví data — vytváří nadměrnou zátěž na server a zvyšuje spotřebu paměti kvůli mnoha současným připojením.
| Parametr | WebSocket | HTTP |
|---|---|---|
| Model | Plně duplexní | Požadavek-odpověď |
| Hlavička | 2–14 bajtů | 400–800 bajtů |
| Trvalé připojení | Ano, jedno | Ne, nové na požadavek |
| Latence | Nízká (1–5 ms) | Vysoká (50–200 ms) |
| Protokol | ws:// nebo wss:// | http:// nebo https:// |
Podle High Performance Browser Networking (Grigorik, O’Reilly) WebSocket snižuje latenci sítě v scénářích reálného času o 40–60% ve srovnání s HTTP Long Pollingem a zatížení serveru klesá 3–5krát díky odstranění opakovaných handshaků.
Díky nízké latenci a obousměrné komunikaci se WebSocket používá v široké škále aplikací. Klíčové scénáře zahrnují okamžitou výměnu zpráv, synchronizaci stavu ve hrách a přenos tržních dat ve finančních systémech.
WebSocket se stal de facto standardem pro chatovací aplikace. Platformy jako Slack, Telegram Web a WhatsApp Web používají WebSocket pro okamžité doručování zpráv. Protokol umožňuje odesílat jak textové zprávy, tak soubory přes jediný kanál a mechanismus ping/pong udržuje spojení aktivní i při nečinnosti.
Víceuživatelské prohlížečové a mobilní hry vyžadují minimální latenci pro synchronizaci stavu hráčů. WebSocket přenáší souřadnice, akce a události v reálném čase bez zpoždění HTTP požadavků. Frameworky jako Socket.IO a Colyseus abstrahují práci na nízké úrovni s protokolem a přidávají automatické znovupřipojení a místnosti.
Burzovní terminály a obchodní platformy používají WebSocket pro příjem kotací v reálném čase. Zpoždění několika milisekund může stát miliony dolarů, proto finanční API — například Binance WebSocket Streams, Coinbase Pro — poskytují právě WebSocket rozhraní pro tržní data.
V mobilním vývoji se WebSocket používá přes nativní API: URLSessionWebSocketTask na iOS a OkHttp WebSocket na Androidu. Pro Flutter existuje knihovna web_socket_channel a pro React Native — react-native-websocket. Zařízení IoT používají WebSocket pro přenos telemetrie a příjem řídicích příkazů, protože protokol spotřebovává méně energie než neustálý HTTP polling.
Podívejme se na příklad serverové části v Node.js s knihovnou ws — nejpopulárnější implementací WebSocketu pro JavaScript. Server přijímá připojení, zpracovává zprávy a vysílá je všem připojeným klientům.
const WebSocket = require('ws')
const wss = new WebSocket.Server({ port: 8080 })
wss.on('connection', (ws) => {
console.log('Nový klient připojen')
ws.on('message', (data) => {
console.log('Přijato:', data.toString())
ws.send('Server obdržel vaši zprávu')
})
ws.on('close', () => {
console.log('Klient odpojen')
})
})
console.log('WebSocket server spuštěn na portu 8080')
Server vytváří instanci WebSocket.Server na portu 8080 a čeká na připojení. Každému novému klientovi je přiřazen samostatný objekt ws, přes který může server odesílat jednotlivé zprávy. Vysílání zpráv všem klientům se provádí hromadným průchodem přes pole připojení. Při velkém počtu klientů (více než 1000) se doporučuje používat knihovny s podporou clusterování, jako je Socket.IO, které přidávají škálování přes Redis a automatické znovupřipojení.
wss.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) {
client.send('Zpráva pro všechny účastníky')
}
})
Kontrola readyState před odesláním je povinná: pokud se klient již odpojil, volání send vyvolá chybu. Příznak WebSocket.OPEN zaručuje, že spojení je aktivní a zpráva bude doručena.
Pro mobilní iOS aplikace je WebSocket implementován přes URLSessionWebSocketTask, dostupný od iOS 13. Relace vytváří úlohu s URL protokolu wss://, poté jsou volány metody send a receive. Příjem zpráv lze organizovat pomocí nepřetržité rekurze receive, která čeká na další zprávu po zpracování předchozí, což zajišťuje nepřetržitý příjem dat bez opětovného připojení. Pro Android se používá OkHttp WebSocket, který poskytuje podobné rozhraní s callbacky onOpen, onMessage, onClosing a onClosed a také automatické znovupřipojení při přerušení spojení.
Při práci s WebSocketem v mobilních aplikacích je důležité zohlednit správu životního cyklu: když aplikace přejde do pozadí, spojení může být systémem přerušeno. Na iOS je nutné obnovit spojení při návratu do popředí prostřednictvím delegáta sceneDidBecomeActive. Na Androidu je třeba použít Lifecycle-aware komponenty nebo Service pro udržení spojení. Dále se doporučuje implementovat exponential backoff při opětovném připojování — zvyšovat interval mezi pokusy z 1 na 30 sekund, aby nedocházelo k nadměrnému zatížení serveru při dočasných síťových problémech.
Často kladené otázky
WebSocket vytváří trvalé plně duplexní spojení, přes které mohou obě strany odesílat data kdykoli. HTTP funguje na schématu požadavek-odpověď, kde každá výměna vyžaduje nové spojení a plné hlavičky. WebSocket používá jeden TCP kanál a hlavičky pouze 2–14 bajtů, což radikálně snižuje zpoždění.
WebSocket používá port 80 pro nezabezpečená spojení (ws://) a port 443 pro zabezpečená (wss://). To umožňuje procházet přes většinu proxy serverů a firemních firewallů bez dodatečné konfigurace. Port 443 se doporučuje pro produkční prostředí kvůli šifrování TLS.
Ano, WebSocket je podporován na všech mobilních platformách. V iOS je nativní třída URLSessionWebSocketTask dostupná od iOS 13. V Androidu — třída OkHttp WebSocket a standardní java.net.WebSocket. Pro React Native existuje knihovna react-native-websocket.
WebSocket Secure — zabezpečená verze protokolu pracující přes TLS. Všechna data jsou šifrována stejně jako v HTTPS. WSS je povinný pro produkční aplikace, zejména při přenosu autentizačních tokenů nebo osobních údajů přes WebSocket.
Hlavní alternativy: HTTP Long Polling (server drží požadavek otevřený), Server-Sent Events (jednosměrný tok ze serveru) a WebRTC Data Channel (peer-to-peer komunikace). Server-Sent Events jsou jednodušší na implementaci, ale nepodporují odesílání od klienta k serveru.
Souhrn
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také