Barcha postlar

Socket.IO: Node.js'da real-time ilovalar yaratish

Saad Takhir · · 0 marta ko'rilgan

Muammo: HTTP "gapirmaydi"

Oddiy HTTP'da aloqa bir tomonlama: brauzer so'raydi, server javob beradi. Server o'zi birinchi bo'lib "yangi xabar keldi" deya olmaydi.

Chat, jonli bildirishnomalar, onlayn o'yinlar yoki buyurtma holatini real vaqtda ko'rsatish uchun esa aynan shu kerak. Har soniyada serverdan "yangilik bormi?" deb so'rab turish (polling) esa ortiqcha yuk va kechikish degani.

Socket.IO nima?

Socket.IO — server va mijoz (brauzer, mobil ilova) o'rtasida ikki tomonlama, real-time aloqa o'rnatuvchi kutubxona. U asosan WebSocket ustida ishlaydi, lekin undan ko'proq narsa beradi:

  • Avtomatik qayta ulanish — internet uzilib qolsa, o'zi qayta ulanadi.
  • Zaxira transport — WebSocket ishlamasa, HTTP long-polling'ga o'tadi.
  • Hodisalar (events) — ma'lumot nomlangan hodisalar orqali yuboriladi.
  • Xonalar (rooms) — foydalanuvchilarni guruhlarga ajratish.
  • Tasdiqlash (acknowledgements) — xabar yetib borganini bilish.

⚠️ Socket.IO — bu "toza" WebSocket emas. Oddiy WebSocket mijozi Socket.IO serveriga ulana olmaydi, ikkala tomonda ham Socket.IO ishlatilishi kerak.

O'rnatish

npm install socket.io          # server uchun
npm install socket.io-client   # frontend uchun

Server

import { createServer } from 'node:http'
import { Server } from 'socket.io'

const httpServer = createServer()
const io = new Server(httpServer, {
  cors: { origin: 'http://localhost:5173' }
})

io.on('connection', (socket) => {
  console.log('Yangi ulanish:', socket.id)

  socket.on('chat:message', (text) => {
    // Hammaga, shu jumladan yuboruvchiga ham
    io.emit('chat:message', { id: socket.id, text })
  })

  socket.on('disconnect', () => {
    console.log('Uzildi:', socket.id)
  })
})

httpServer.listen(3000, () => {
  console.log('Socket server: http://localhost:3000')
})

Mijoz (frontend)

import { io } from 'socket.io-client'

const socket = io('http://localhost:3000')

socket.on('connect', () => {
  console.log('Ulandik!', socket.id)
})

socket.on('chat:message', (msg) => {
  console.log(`${msg.id}: ${msg.text}`)
})

socket.emit('chat:message', 'Salom, hammaga!')

Asosiy g'oya oddiy: emit — hodisa yuborish, on — hodisani tinglash. Ikkala tomonda ham bir xil ishlaydi.

Kimga yuborish kerak?

socket.emit('event', data)            // faqat shu foydalanuvchiga
io.emit('event', data)                // hammaga
socket.broadcast.emit('event', data)  // yuboruvchidan boshqa hammaga
io.to('room-1').emit('event', data)   // faqat xonadagilarga

Xonalar (rooms)

Masalan, har bir chat guruhi yoki har bir buyurtma uchun alohida xona:

socket.on('room:join', (roomId) => {
  socket.join(roomId)
  socket.to(roomId).emit('room:notice', `${socket.id} qo'shildi`)
})

Xonalar faqat serverda mavjud — mijoz ularni ko'rmaydi, faqat xabarlarni oladi.

Tasdiqlash (acknowledgement)

Xabar serverga yetib borgani va qayta ishlanganini bilish uchun:

// Mijoz
const res = await socket.emitWithAck('order:create', { item: 'Pizza' })
console.log(res.status) // 'ok'

// Server
socket.on('order:create', (order, callback) => {
  // ... bazaga saqlash
  callback({ status: 'ok' })
})

Qayerlarda ishlatiladi?

  • Chat va messenjerlar
  • Buyurtma holati (kafe, yetkazib berish)
  • Jonli bildirishnomalar
  • Admin panelda real-time statistika
  • Onlayn o'yinlar va hamkorlikda tahrirlash

Muhim maslahatlar

  • Autentifikatsiya — ulanishda tokenni tekshiring: io(url, { auth: { token } }) va serverda io.use() middleware.
  • Hodisa nomlari — chat:message, order:update kabi prefiksli nomlar kod tartibini saqlaydi.
  • Bir nechta server — loyiha o'sib, bir nechta server ishlatsangiz, Redis adapter kerak bo'ladi, aks holda serverlar bir-birining mijozlarini ko'rmaydi.
  • Ma'lumotni tekshiring — mijozdan kelgan har qanday ma'lumotga ishonmang, xuddi REST API'dagidek validatsiya qiling.

Xulosa

Socket.IO real-time funksiyalarni qo'shishni juda osonlashtiradi: bir nechta qator kod bilan ishlaydigan chat yoki jonli bildirishnomalar tizimiga ega bo'lasiz. Kichik chat ilovasidan boshlang — bu Socket.IO'ni tushunishning eng yaxshi yo'li.

Ulashish · 0 marta ulashilgan
Bog'lanish