Ответ
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-соединений или когда требуется полный контроль над сетевым стеком.