Ответ
Протокол WebSocket работает поверх TCP (Transmission Control Protocol).
Ключевые этапы установки соединения:
- Handshake (рукопожатие): Инициируется клиентом через обычный HTTP/HTTPS запрос с заголовками
Upgrade: websocketиConnection: Upgrade. Это позволяет проходить через большинство брандмауэров и прокси. - Переключение протокола: Если сервер поддерживает WebSocket, он отвечает кодом
101 Switching Protocols. После этого соединение переиспользует тот же самый TCP-сокет, но общение продолжается уже по протоколу WebSocket.
Пример кода (клиент на Java с использованием JSR-356):
@ClientEndpoint
public class SimpleWebSocketClient {
@OnOpen
public void onOpen(Session session) {
System.out.println("[Connected] Session ID: " + session.getId());
}
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("[Message from Server] " + message);
}
@OnClose
public void onClose(Session session, CloseReason closeReason) {
System.out.println("[Disconnected] Reason: " + closeReason.getReasonPhrase());
}
public static void main(String[] args) throws Exception {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
String serverUri = "ws://echo.websocket.org:80/";
Session session = container.connectToServer(SimpleWebSocketClient.class, URI.create(serverUri));
session.getBasicRemote().sendText("Hello, WebSocket!");
Thread.sleep(5000); // Даём время на получение ответа
session.close();
}
}
Преимущества перед HTTP:
- Полноценный дуплекс: Двусторонняя связь в реальном времени.
- Низкие накладные расходы: После handshake данные передаются в виде легких фреймов (2-14 байт заголовка), а не тяжелых HTTP-заголовков с каждым сообщением.