Tarmoq so'rovlari

WebSocket

WebSocket โ€” bu server bilan doimiy, ikki tomonlama aloqa kanalini o'rnatuvchi protokol. fetchdan farqli o'laroq, u so'rov-javob modelida ishlamaydi: ulanish bir marta o'rnatiladi va ochiq turadi โ€” server istagan paytda mijozga xabar yubora oladi. Bu real vaqt ilovalari uchun ajralmas: chat, o'yin, jonli bildirishnomalar, birja narxlari va h.k.

WebSocket nima uchun kerak?

Oddiy fetch yoki XHR bilan server faqat so'rovga javob bera oladi โ€” mijoz so'ramaguncha, server o'zidan xabar yubora olmaydi. Ammo real vaqt ilovalarida server o'zi xabar yuborishi kerak bo'ladi:

WebSocket aynan shu muammoni hal qiladi: ulanish ochiq turadi va ikkala tomon ham istagan paytda xabar yubora oladi.

Ulanishni o'rnatish

WebSocket ulanishi new WebSocket(url) orqali yaratiladi. Manzil http:// emas, ws:// (yoki xavfsiz wss://) protokoli bilan boshlanadi:

let socket = new WebSocket('wss://example.com/chat');
wss:// โ€” bu shifrlangan WebSocket. U nafaqat xavfsizroq, balki turli proksi-serverlar orqali ham ishonchliroq o'tadi. Amaliyotda deyarli doim wss:// ishlatiladi.

Asosiy hodisalar

Ulanish o'rnatilgach, uning hayotini to'rtta hodisa boshqaradi:

let socket = new WebSocket('wss://example.com/chat');

socket.onopen = function () {
  console.log('Ulanish o'rnatildi');
};

socket.onmessage = function (event) {
  console.log('Serverdan xabar: ' + event.data);
};

socket.onerror = function (error) {
  console.log('Xatolik yuz berdi');
};

socket.onclose = function (event) {
  if (event.wasClean) {
    console.log('Ulanish toza yopildi');
  } else {
    console.log('Ulanish uzildi (masalan, server o'chdi)');
  }
  console.log('Kod: ' + event.code + ', sabab: ' + event.reason);
};

Xabar yuborish: send

Serverga xabar yuborish uchun socket.send() ishlatiladi. Uni matn (string) yoki binar ma'lumot (Blob, ArrayBuffer) bilan chaqirish mumkin:

// Matn yuborish
socket.send('Salom, server!');

// Obyektni JSON qilib yuborish
socket.send(JSON.stringify({
  type: 'message',
  text: 'Assalomu alaykum'
}));
Diqqat: send()ni faqat ulanish ochilgandan keyin (ya'ni onopendan so'ng) chaqiring. Aks holda ulanish hali tayyor emas va xatolik yuz beradi. Ulanish holatini socket.readyState orqali tekshirish mumkin.
socket.onopen = function () {
  // Endi yuborish xavfsiz
  socket.send('Ulanish tayyor, salom!');
};

readyState โ€” ulanish holati

socket.readyState ulanishning hozirgi holatini bildiradi:

if (socket.readyState === WebSocket.OPEN) {
  socket.send('Xabar');
} else {
  console.log('Ulanish hali tayyor emas');
}

Ulanishni yopish

Ulanishni tugatish uchun socket.close() ishlatiladi. Ixtiyoriy ravishda yopilish kodi va sababini berish mumkin:

// Oddiy yopish
socket.close();

// Kod va sabab bilan
socket.close(1000, 'Ish tugadi');
// 1000 โ€” normal yopilish kodi
close hodisasidagi event.code yopilish sababini bildiradi. 1000 โ€” normal yopilish. Boshqa kodlar (masalan, 1006) g'ayritabiiy uzilishni bildiradi.

Qayta ulanish (reconnection)

Real ilovalarda tarmoq uzilishi mumkin. Ulanish uzilganda uni avtomatik qayta tiklash muhim. Buning uchun close hodisasida yangi ulanish yaratamiz:

function ulanish() {
  let socket = new WebSocket('wss://example.com/chat');

  socket.onopen = function () {
    console.log('Ulandi');
  };

  socket.onmessage = function (event) {
    console.log('Xabar: ' + event.data);
  };

  socket.onclose = function (event) {
    if (!event.wasClean) {
      // Ulanish g'ayritabiiy uzildi โ€” qayta ulanamiz
      console.log('Ulanish uzildi, 3 sekunddan keyin qayta urinamiz...');
      setTimeout(ulanish, 3000);
    }
  };

  socket.onerror = function () {
    console.log('Xatolik, ulanish yopiladi');
  };
}

ulanish();
Amaliyotda "eksponensial kutish" (exponential backoff) qo'llaniladi: har muvaffaqiyatsiz urinishdan keyin kutish vaqtini oshirib borish (3s, 6s, 12s ...). Bu serverga ortiqcha yuk tushmasligini ta'minlaydi.

To'liq amaliy misol: oddiy chat

Xabar qabul qilish va yuborishni birlashtirgan soddalashtirilgan chat mijozi:

let socket = new WebSocket('wss://example.com/chat');

// Ulanish ochilganda
socket.onopen = function () {
  console.log('Chatga ulandingiz');
};

// Xabar kelganda
socket.onmessage = function (event) {
  let msg = JSON.parse(event.data);
  console.log(msg.user + ': ' + msg.text);
};

// Xabar yuborish funksiyasi
function xabarYubor(matn) {
  if (socket.readyState === WebSocket.OPEN) {
    socket.send(JSON.stringify({
      user: 'Ali',
      text: matn
    }));
  }
}

// Foydalanish (masalan, tugma bosilganda):
// xabarYubor('Salom hammaga!');

WebSocket va fetch: farqi

Ikki texnologiya butunlay boshqa maqsadlar uchun:

Qoida oddiy: agar sizga faqat so'raganda ma'lumot kerak bo'lsa โ€” fetch. Agar server o'zi xabar yuborishi va aloqa real vaqtda bo'lishi kerak bo'lsa โ€” WebSocket.

Xulosa