Как сделать двустороннее взаимодействие без WebSocket

Ответ

Для двустороннего взаимодействия без WebSocket можно использовать:

  1. Long Polling - сервер держит соединение открытым, пока не появится новое сообщение:
function longPoll() {
  fetch('/updates')
    .then(response => response.json())
    .then(data => {
      // Обработка данных
      longPoll(); // Повторный запрос
    });
}
  1. Server-Sent Events (SSE) - односторонний поток от сервера, но можно комбинировать с обычными запросами:
const eventSource = new EventSource('/updates');
eventSource.onmessage = (e) => {
  console.log(e.data);
};
  1. Polling - периодические запросы:
setInterval(() => {
  fetch('/check-updates')
    .then(/* ... */);
}, 5000);
  1. HTTP/2 Server Push - сервер может инициировать отправку данных.

Для полноценного двустороннего обмена лучше комбинировать SSE для сервер->клиент и обычные AJAX/Fetch для клиент->сервер.

Ответ 18+ 🔞

А, ну это ж классика, блядь! Веб-сокеты не подвезли, а чат сделать охота? Да без проблем, ёпта! Есть же старые, добрые костыли, которые ещё наши деды в полях пахали. Смотри сюда, я тебе сейчас всё разжую.

Долгий опрос (Long Polling) Это когда ты такой: "Эй, сервер, есть чё новенького?" А сервер тебе: "Погоди-ка, сынок, ща посмотрю..." И сидит, блядь, молчит, пока у него в жопе не созреет сообщение. Только тогда отвечает. А ты, получив ответ, сразу же новый запрос кидаешь. Получается этакая назойливая сука, которая не отстаёт.

function longPoll() {
  fetch('/updates')
    .then(response => response.json())
    .then(data => {
      // Обработка данных
      longPoll(); // И по новой, блядь!
    });
}

События, отправляемые сервером (SSE) Тут уже поинтереснее. Сервер может сам начать тебе потоково лить информацию в уши, как бабка у подъезда сплетни. Но есть нюанс, ёпта — это в одну сторону! Только сервер -> клиент. Чтобы ответить, тебе придётся отдельно, другим запросом, ему в ебало отправить своё сообщение.

const eventSource = new EventSource('/updates');
eventSource.onmessage = (e) => {
  console.log(e.data); // Ловим, что нам наговорили
};

Тупой опрос (Polling) Самый простой, как валенок. Раз в N секунд ты тупо дёргаешь сервер: "Ну чё там? А щас? А теперь?" Серверу, конечно, может надоесть, но если сообщения редкие — сойдёт. Главное, не дёргай слишком часто, а то забанят, пидарас.

setInterval(() => {
  fetch('/check-updates')
    .then(/* ... */); // Делаем вид, что обрабатываем
}, 5000); // Раз в пять секунд, например

HTTP/2 Server Push Это уже для продвинутых, блядь. Сервер, такой хитрожопый, может сам, без спросу, начать тебе данные пихать, когда ему вздумается. Но это надо, чтобы всё окружение правильно было настроено, иначе нихуя не выйдет.

Итог, ёбушки-воробушки: Если тебе нужен полноценный диалог — комбинируй, как умный человек. Для потока от сервера бери SSE, а чтобы своё ввернуть — обычный Fetch/AJAX запрос шли ему нахуй. Получится почти как веб-сокет, только на коленке и с приключениями. Всё гениальное — просто, как три копейки!