В чем разница между WebSocket и сокетом (Socket) в iOS?

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

Ответ

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

Socket (сокет) — это низкоуровневый программный интерфейс (API) для сетевого взаимодействия по протоколам TCP или UDP. Требует ручного управления подключением, сериализацией данных, обработкой ошибок и поддержанием соединения.

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

Аспект WebSocket Socket (Network framework)
Уровень Протокол прикладного уровня (поверх HTTP) Транспортный уровень (TCP/UDP)
Сложность Высокоуровневый, встроенная поддержка в URLSession Низкоуровневый, требуется ручная реализация
Данные Обмен сообщениями или фреймами Работа с потоками байтов (Data)
Состояние Управление соединением встроено в протокол Требуется ручной контроль состояния

Пример WebSocket (Swift):

let url = URL(string: "wss://echo.websocket.org")!
let webSocketTask = URLSession.shared.webSocketTask(with: url)
webSocketTask.resume()

// Отправка сообщения
webSocketTask.send(.string("Hello WebSocket")) { error in
    if let error = error { print("Send error: (error)") }
}

// Получение сообщений
func receiveMessage() {
    webSocketTask.receive { result in
        switch result {
        case .success(let message):
            switch message {
            case .string(let text): print("Received: (text)")
            case .data(let data): print("Received data: (data)")
            @unknown default: break
            }
        case .failure(let error): print("Receive error: (error)")
        }
        self.receiveMessage() // Продолжаем слушать
    }
}

Пример TCP Socket (Swift, Network framework):

import Network

let connection = NWConnection(host: "example.com", port: 80, using: .tcp)
connection.stateUpdateHandler = { newState in
    switch newState {
    case .ready:
        print("Socket connected")
        let data = "Hello Socketn".data(using: .utf8)!
        connection.send(content: data, completion: .idempotent)
    case .failed(let error): print("Connection failed: (error)")
    default: break
    }
}

connection.start(queue: .main)

Когда использовать:

  • WebSocket — для реального времени (чаты, уведомления, биржевые тикеры), когда нужен стандартный протокол поверх HTTP/HTTPS.
  • Сокеты — для кастомных протоколов, высокой производительности, P2P-соединений или когда требуется полный контроль над сетевым стеком.