Назад к вопросам
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)