Sobes.tech
Junior

Какви са уеб сокетите?

sobes.tech AI

Отговор от AI

Websockets (Websockets) е протокол за двупосочна комуникация чрез едно TCP свързване, който позволява обмен на данни в реално време между браузър и сървър.

Ключови разлики спрямо традиционните HTTP заявки:

  • Двупосочна комуникация: Сървърът може да изпраща данни към клиента без предварителна заявка от страна на клиента.
  • Едно свързване: Установява се едно дълготрайно свързване, което елиминира разходите за създаване на ново свързване за всеки обмен на данни (като при HTTP).
  • Намаляване на закъснението: По-малко време се изразходва за установяване на връзката, обмен на заглавки и обработка на кратки заявки/отговори.

Принцип на работа:

  1. Handshake: Браузърът изпраща специална HTTP заявка към сървъра (с заглавки Upgrade: websocket и Connection: Upgrade).
  2. Установяване на връзка: Ако сървърът поддържа websocket-и, той отговаря с код 101 Switching Protocols, след което връзката преминава към websocket протокол.
  3. Пренос на данни: След установяване на връзката, двете страни могат свободно да обменят съобщения по всяко време.

Примери за използване:

  • Онлайн игри
  • Чатове и месинджъри
  • Реално-времеви актуализации на данни (котировки, новини)
  • Колаборативни инструменти

Предимства:

  • Ниска закъснение
  • Ефективно използване на ресурси (по-малко overhead)
  • Двупосочна комуникация в реално време

Недостатъци:

  • Изисква поддръжка както от страна на клиента (браузър), така и от страна на сървъра.
  • По-сложна реализация в сравнение с прости HTTP заявки.

Пример за клиентски код на JavaScript:

// създаване на websocket
const socket = new WebSocket('wss://example.com/websocket');

// обработчик за отваряне на връзката
socket.onopen = function(event) {
  console.log('Връзката е установена');
  socket.send('Здравей, сървър!'); // изпращане на съобщение към сървъра
};

// обработчик за получаване на съобщения
socket.onmessage = function(event) {
  console.log('Получено съобщение от сървъра: ' + event.data);
};

// обработчик за затваряне на връзката
socket.onclose = function(event) {
  if (event.wasClean) {
    console.log(`Връзката е затворена чисто, код=${event.code} причина=${event.reason}`);
  } else {
    console.log('Връзката е прекъсната'); // например, поради мрежов проблем
  }
};

// обработчик за грешки
socket.onerror = function(error) {
  console.error(`Грешка в websocket: ${error}`);
};

// затваряне на връзката (ако е необходимо)
// socket.close();