Назад к вопросам
Middle
77
questionbank
Какие ключевые различия существуют между работой с HTTP-запросами и WebSocket?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
HTTP - это протокол запроса-ответа: клиент отправляет запрос, сервер отвечает, соединение после ответа может быть закрыто. WebSocket предоставляет двустороннее, полнодуплексное соединение через одно TCP-соединение, позволяя как серверу, так и клиенту отправлять данные в любое время.
| Признак | HTTP | WebSocket |
|---|---|---|
| Тип связи | Запрос-ответ | Полнодуплексный (двусторонний) |
| Соединение | Обычно краткосрочное, для каждого запроса | Долгоживущее, одно для обмена сообщениями |
| Накладные расходы | Высокие на каждый запрос (заголовки) | Низкие после установки соединения |
| Использование | Загрузка статического контента, API | Чат, онлайн-игры, уведомления в реальном времени |
| Протокол | Основан на TCP | Использует хендшейк по HTTP, затем переключается на собственный протокол поверх TCP |
| Механизм | Клиент инициирует обмен данными | Как клиент, так и сервер могут инициировать |
Для HTTP-запросов часто используются классы URLSession, URLRequest, URLSessionDataTask.
// Пример GET запроса с URLSession
import Foundation
let url = URL(string: "https://api.example.com/data")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, error == nil else {
print("Error: \(error?.localizedDescription ?? "Unknown error")")
return
}
// Process received data
print(String(data: data, encoding: .utf8) ?? "Invalid data")
}
task.resume()
Для работы с WebSocket в iOS можно использовать URLSessionWebSocketTask.
// Пример WebSocket соединения с URLSessionWebSocketTask
import Foundation
let url = URL(string: "wss://api.example.com/realtime")!
let webSocketTask = URLSession.shared.webSocketTask(with: url)
webSocketTask.resume()
// Отправка сообщения
func sendMessage(_ message: String) {
let message = URLSessionWebSocketTask.Message.string(message)
webSocketTask.send(message) { error in
if let error = error {
print("WebSocket send error: \(error)")
}
}
}
// Прослушивание сообщений
func receiveMessage() {
webSocketTask.receive { result in
switch result {
case .failure(let error):
print("WebSocket receive error: \(error)")
case .success(let message):
switch message {
case .string(let text):
print("Received string: \(text)")
case .data(let data):
print("Received data: \(data)")
@unknown default:
fatalError()
}
self.receiveMessage() // Рекурсивно вызываем для получения следующего сообщения
}
}
}
// Запустить прослушивание после установки соединения
receiveMessage()
// Закрытие соединения
// webSocketTask.cancel(with: .goingAway, reason: nil)