Что такое протокол WebSocket?

«Что такое протокол WebSocket?» — вопрос из категории Сети, который задают на 23% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

WebSocket — это протокол связи поверх TCP, обеспечивающий постоянное полнодуплексное (двустороннее) соединение между клиентом (например, браузером или мобильным приложением) и сервером. Он предназначен для обмена данными в реальном времени с минимальными задержками.

Ключевые отличия от HTTP:

Аспект HTTP WebSocket
Модель связи Запрос-ответ (полудуплексная) Постоянное полнодуплексное соединение
Инициатива отправки Только клиент Клиент и сервер могут отправлять данные в любой момент
Накладные расходы Заголовки передаются с каждым запросом Минимальные после установки соединения (handshake)

Пример использования в Swift с URLSessionWebSocketTask:

// 1. Установка соединения
let socketURL = URL(string: "wss://echo.websocket.org")! // wss — защищенный WebSocket
let webSocketTask = URLSession.shared.webSocketTask(with: socketURL)
webSocketTask.resume()

// 2. Отправка сообщения (текст или данные)
let message = URLSessionWebSocketTask.Message.string("Привет, сервер!")
webSocketTask.send(message) { error in
    if let error = error {
        print("Ошибка отправки: (error)")
    }
}

// 3. Прием сообщений (рекурсивный вызов для непрерывного прослушивания)
func listen() {
    webSocketTask.receive { result in
        switch result {
        case .success(let message):
            switch message {
            case .string(let text):
                print("Получен текст: (text)")
            case .data(let data):
                print("Получены данные: (data)")
            @unknown default:
                break
            }
            self.listen() // Слушаем следующее сообщение
        case .failure(let error):
            print("Ошибка приема: (error)")
        }
    }
}
listen()

// 4. Закрытие соединения
webSocketTask.cancel(with: .normalClosure, reason: nil)

Типичные сценарии использования: чаты, онлайн-игры, биржевые тикеры, live-уведомления, совместное редактирование документов.