Вместо да имаме т.н. HTTP Polling, тоест клиентът постоянно да пита сървъра дали има промяна, нова информация и т.н…., сървърът сам изпраща рекуест към клиента когато има такава. Тоест имаме full duplex, двуканална и постоянно отворена TCP връзка. „Fully duplex, bi-directional communication channel, that allows the client and the server to talk to each other in real time, without having continuously make requests“.
WebSocket може да се разглежда като един вид надстройка на HTTP.
Клиентът трябва да изпрати съответни HTTP хедъри, с които да каже на сървъра „искам да ъпгрейднем наша връзка до WebSocket“. „To establish a WebSocket connection, the client sends a WebSocket handshake request, for which the server returns a WebSocket handshake response, as shown in the example below.“
GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Origin: http://example.com
И примерен отговор от сървъра:
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= Sec-WebSocket-Protocol: chat
Интересно е, че клиентът трябва да поиска да се премине на WebSocket, не сървърът. Сървърът също може да го поиска като отговори на даден обикновен рекуест с „426 Upgrade Required“, но след това пак трябва да се мине по същият „WebSocket handshake“ като по-горе.
„A connection upgrade must be requested by the client; if the server wants to enforce an upgrade it may send a 426 Upgrade Required
response. The client can then send a new request with the appropriate upgrade headers while keeping the connection open.“
Backend езици като Java, Python, PHP… имат готови библиотеки, с които да се напише приложение, което да действа като webserver, поддържащ WebSocket протокола.
Откъм frontend, JavaScript вече поддържа WebSocket клиент, с който можем да напишем прост WebSocket клиент. Всички модерни браузъри го поддържат. Пример:
// Create WebSocket connection. const socket = new WebSocket('ws://localhost:8080'); // Connection opened socket.addEventListener('open', function (event) { socket.send('Hello Server!'); }); // Listen for messages socket.addEventListener('message', function (event) { console.log('Message from server ', event.data); });