Socket.IO — bu nədir, real-time qarşılıqlı əlaqə kitabxanası

Müəllif: IT Sectr Dərc olunub: 2026-06-01 Oxuma vaxtı: 8 dəq

Socket.IO — müştəri və server arasında ikitərəfli real-time əlaqə üçün WebSocket əsasında avtomatik fallback ilə işləyən kitabxanadır. O, söhbətlərdə, oyunlarda və birgə redaktorlarda ani məlumat ötürülməsi üçün etibarlı nəqliyyat təmin edir. Socket.IO rəsmi sənədlərinə (2024) görə, kitabxana düzgün konfiqurasiya ilə bir serverdə bir milyondan çox bağlantını idarə edə bilər.

Əsas məqamlar

  • Socket.IO — WebSocket və HTTP long-polling üzərində işləyən real-time kommunikasiya kitabxanası.
  • İkitərəfli əlaqə — həm müştəri, həm də server istənilən anda məlumat göndərməyə başlaya bilər.
  • Avtomatik fallback — WebSocket əlçatan olmadıqda kodu dəyişmədən HTTP long-polling-ə keçir.
  • Otaqlar və ad sahələri — ünvanlı mesaj göndərmək üçün bağlantıların qruplaşdırılması.
  • Hadisə modeli — ixtiyari payload ilə adlandırılmış hadisələr vasitəsilə məlumat mübadiləsi.

Socket.IO nədir?

Socket.IO — müştəri və server arasında ikitərəfli hadisə yönümlü kommunikasiya üçün açıq mənbəli JavaScript kitabxanasıdır. O, 2010-cu ildə Guillermo Rauch tərəfindən yaradılmış və o vaxtdan Node.js üçün real-time proqramların de-fakto standartına çevrilmişdir.

Yerli WebSocket API-dən fərqli olaraq, Socket.IO əlavə abstraksiyalar təmin edir: otaqlar, ad sahələri, avtomatik yenidən qoşulma və ikili məlumat növləri. Kitabxana WebSocket-in ayrıca tətbiqi deyil — nəqliyyat qatı kimi Engine.IO-dan istifadə edir, o əvvəlcə HTTP long-polling bağlantısı qurur, sonra WebSocket-ə yüksəltməyə cəhd edir.

npm statistikasına (2025) görə, həftədə 12 milyondan çox socket.io paketi endirilir və bu onu Node.js ekosistemində ən populyar kitabxanalardan birinə çevirir. Socket.IO bütün müasir platformalarda dəstəklənir: brauzerlər, iOS, Android, React Native və masaüstü tətbiqlər.

Yaranma tarixi və versiyalar

Socket.IO versiya 1.0 2014-cü ildə buraxılmış və bir TCP bağlantısı üzərindən bir neçə məntiqi kanalı multipleksləşdirməyə imkan verən ad sahələri (namespaces) konsepsiyasını təqdim etmişdir. 2.0 versiyası (2017) ikili məlumat dəstəyi əlavə etmiş və analiz performansını yaxşılaşdırmışdır. Cari versiya 4.x (2020–2025) TypeScript-in tam dəstəyi, miqyaslama üçün flaqman adaptasiya rejimi və təkmilləşdirilmiş geriyə uyğunluğu əhatə edir.

Hər bir əsas buraxılış API-nin geriyə uyğunluğunu qoruyur — socket.io@2 müştərisi xüsusi uyğunluq rejimi vasitəsilə socket.io@4 serverinə qoşula bilər. Bu, müştəri hissəsinin mərhələli şəkildə yeniləndiyi uzunmüddətli layihələr üçün vacibdir.

Socket.IO necə işləyir

Socket.IO arxitekturası iki komponentdən ibarətdir: server modulu (npm-paket socket.io) və müştəri modulu (npm-paket socket.io-client). Server Node.js HTTP(S) serveri üzərində işləyir və nəqliyyat səviyyəsini idarə etmək üçün Engine.IO-dan istifadə edir.

İlk qoşulmada müştəri serverə HTTP sorğusu göndərir. Engine.IO cavab verir və long-polling bağlantısı qurur. Bundan sonra müştəri nəqliyyat protokolunu WebSocket-ə yüksəltmək üçün sorğu göndərir. Server WebSocket-i dəstəkləyirsə, yüksəltmə bir TCP sessiyası çərçivəsində baş verir. Əks halda, bağlantı long-polling olaraq qalır və tətbiq kodu dəyişiklik tələb etmir.

Socket.IO performans testlərinə (2024) görə, WebSocket istifadə edərkən gecikmə mesaj ötürülməsi üçün 2–5 ms təşkil edir, halbuki long-polling HTTP əlavə xərcləri səbəbindən 150–300 ms əlavə edir. Nəqliyyat seçimi tərtibatçı üçün şəffafdır.

Engine.IO protokolu

Engine.IO — Socket.IO-nun qurulduğu aşağı səviyyəli nəqliyyat qatıdır. O, bağlantının qurulması, nəqliyyat seçimi, heartbeat (ping/pong) və bağlantının kəsilməsinə cavabdehdir. Engine.IO paketlərinin əsas növləri: open (başlatma), close (bağlama), ping/pong (həyat yoxlaması), upgrade (nəqliyyat dəyişikliyi), message (məlumat).

Socket.IO Engine.IO üzərində öz hadisə modelini qurur — tərtibatçı məhz bununla işləyir. Hər bir Socket.IO mesajı Engine.IO paketinə message növü ilə və çatdırılmanı təsdiqləmək üçün unikal identifikatorla yığılır.

Socket.IO-nun əsas xüsusiyyətləri

Socket.IO yerli WebSocket API-də olmayan və real-time tətbiqlərin hazırlanmasını əhəmiyyətli dərəcədə asanlaşdıran funksiyalar dəsti təqdim edir. Əsas olanları nəzərdən keçirək.

Avtomatik yenidən qoşulma — müştəri qopma zamanı eksponensial gecikmə ilə (100 ms, 200 ms, 400 ms... maksimuma qədər) avtomatik olaraq bağlantını bərpa edir. Socket.IO sənədlərinə (2024) görə, retry parametrləri reconnectionDelay və reconnectionAttempts vasitəsilə əlçatandır. Bu seçim şəbəkə dəyişikliyi zamanı bağlantının kəsilə biləcəyi mobil tətbiqlər üçün kritikdir.

Otaqların dəstəyi — server soketləri otaqlarda qruplaşdıra və mesajları yalnız müəyyən otağın üzvlərinə göndərə bilər. Otaqlar açıq şəkildə yaradılma tələb etmir — ilk soket qoşulduqda yaradılır. Otaqlar proses səviyyəsində tətbiq edilir və xüsusi adapter olmadan müxtəlif serverlər arasında paylaşılmır.

Ad sahələri — bir bağlantı üzərində rabitə kanallarının məntiqi bölünməsi. Məsələn, söhbət mesajları üçün /chat və bildirişlər üçün /notifications ad sahəsi. Hər bir ad sahəsinin öz otaqları, middleware və işləyiciləri var. Ad sahələri bir TCP bağlantısı üzərindən multipleksləşdirilir ki, bu da resurslara qənaət edir.

Çatdırılmanın təsdiqi — mesaj göndərərkən callback funksiyası ötürülə bilər, server qəbuli təsdiqlədikdə bu funksiya çağırılır. Bu, hər bir paketin unikal identifikatoru vasitəsilə həyata keçirilir. Təsdiq mexanizmi kritik vacib mesajların (məsələn, ödəniş əməliyyatlarının) alıcıya çatdırıldığına zəmanət verir.

Socket.IO vs WebSocket: müqayisə

Socket.IO və yerli WebSocket arasında seçim layihənin tələblərindən asılıdır. WebSocket bütün müasir brauzerlər tərəfindən dəstəklənən standartlaşdırılmış protokoldur (RFC 6455). Socket.IO WebSocket-i nəqliyyat kimi istifadə edən, lakin əlavə funksiyalar əlavə edən kitabxanadır.

XüsusiyyətSocket.IOWebSocket
NəqliyyatWebSocket + HTTP long-polling (fallback)Yalnız WebSocket
Hadisə modeliJSON payload ilə adlandırılmış hadisələrYalnız mətn/ikili çərçivələr
OtaqlarDaxili soket qruplaşdırmasıƏl ilə tətbiq tələb edir
Avto-yenidən qoşulmaDaxiliƏl ilə tətbiq tələb edir
Çatdırılma təsdiqiCallback ilə ACK mexanizmiProtokol genişləndirmələri ilə əlçatandır
MiqyaslanmaAdapterlər (Redis, MongoDB, Cluster)Öz infrastrukturunu tələb edir
Kitabxana ölçüsü~50 KB (müştəri, gzip)Brauzerə daxildir (0 KB)

Layihə maksimum performans və minimal müştəri ölçüsü tələb edirsə — yerli WebSocket-i seçin. Etibarlı çatdırılma, qruplaşdırma və hadisə modeli lazımdırsa — Socket.IO hazır abstraksiyalar sayəsində inkişaf müddətini 2–3 dəfə qısaldacaq.

State of JS 2024 sorğusuna görə, real-time tətbiq tərtibatçılarının 67%-i Socket.IO-ya üstünlük verir, çünki API rahatlığı və kənar halların daxili işlənməsi (şəbəkə qopması, yenidən qoşulma, ikili məlumatlar) səbəbindən.

Layihədə Socket.IO-nu necə qoşmaq olar

Socket.IO-nun quraşdırılması iki paket tələb edir: server və müştəri. Node.js layihəsi üçün əsas konfiqurasiyaya baxaq. Server HTTP serveri yaradır, Socket.IO-nu işə salır və müştərilərin qoşulma və ayrılma hadisələrini idarə edir.

Socket.IO sənədlərinə (2024) görə, server daxili http modulundan istifadə edərək Express olmadan işə salına bilər, lakin real layihələrdə HTTP sorğularının marşrutlaşdırılması üçün adətən Express və ya Fastify istifadə olunur.

Node.js-də server kodu

js
const express = require('express');
const http = require('http');
const Server = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = new Server(server, {
    cors: { origin: '*' }
});

io.on('connection', (socket) => {
    console.log('Müştəri qoşuldu:', socket.id);

    socket.emit('welcome', { message: 'Hello from server' });

    socket.on('disconnect', () => {
        console.log('Müştəri ayrıldı');
    });
});

server.listen(3000, () => {
    console.log('Server 3000 portunda işləyir');
});

Brauzerdə müştəri kodu

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

const socket = io('http://localhost:3000', {
    transports: ['websocket', 'polling'],
    reconnectionDelay: 1000
});

socket.on('welcome', (data) => {
    console.log(data.message);
});

socket.emit('chat message', {
    user: 'Alice',
    text: 'Hello everyone!'
});

Socket.IO-da hadisələr və otaqlar

Socket.IO hadisə modeli adlandırılmış hadisələrə əsaslanır. Server və müştəri müəyyən hadisə adına bağlı mesajlar göndərir və qəbul edir. Payload sətir, JSON obyekti və ya ikili məlumat (Buffer, ArrayBuffer, Blob) ola bilər.

Hər bir hadisə ACK (acknowledgement) — qəbul edən tərəfindən hadisə işləndikdən sonra göndərən tərəfdə icra olunan callback funksiyasının ötürülməsini dəstəkləyir. Bu, hadisə modeli üzərində request-response nümunəsini tətbiq etməyə imkan verir. ACK yalnız qəbul edən callback-i açıq şəkildə çağırdıqda işləyir.

Socket.IO sənədlərinə (2024) görə, optimal performans üçün tək mesajın maksimum ölçüsü 1 MB-dan çox olmamalıdır. Daha böyük mesajlar parçalara bölünməli və ya ayrıca kanal vasitəsilə ötürülməlidir.

Otaqlarla iş

js
io.on('connection', (socket) => {
    socket.join('room-1');

    socket.to('room-1').emit('user joined', {
        userId: socket.id
    });

    io.to('room-1').emit('message', {
        text: 'Broadcast to room'
    });

    socket.leave('room-1');
});

Socket.IO-nun miqyaslanması

Üfüqi miqyaslanma Socket.IO bir neçə server prosesi arasında vəziyyətin bölüşdürülməsi probleminin həllini tələb edir. Otaqlar, ad sahələri və qoşulmuş soketlərin siyahısı bir prosesin yaddaşında saxlanılır və adapter olmadan digər proseslərə görünmür.

Rəsmi Socket.IO adapterləri: redis (Redis Pub/Sub vasitəsilə), mongodb (MongoDB change streams vasitəsilə), cluster (Node.js cluster çoxprosesli rejimi üçün). Adapter Socket.IO instansiyaları arasında mesaj brokeri kimi çıxış edir. Otağa hadisə göndərildikdə, adapter onu Redis-də dərc edir və bütün serverlər bildiriş alır.

Socket.IO yük testlərinə (2024) görə, Redis adapteri olan 4 serverdən ibarət klaster 400 000-ə qədər eyni vaxtda bağlantını 10 ms-dən aşağı gecikmə ilə idarə edir. Adapter olmadan bir Node.js prosesinin maksimum tutumu 1 GB yaddaşda təxminən 100 000 bağlantı təşkil edir.

Redis adapterinin konfiqurasiyası

js
const Server = require('socket.io');
const RedisAdapter = require('@socket.io/redis-adapter');
const Redis = require('ioredis');

const pubClient = new Redis({ host: 'localhost', port: 6379 });
const subClient = pubClient.duplicate();
const io = new Server(server);
io.adapter(RedisAdapter(pubClient, subClient));

Kubernetes və ya Docker Swarm istifadə edərkən, bir müştəridən gələn sorğuların eyni serverə düşməsi üçün əlavə olaraq session affinity (sticky sessions) konfiqurasiya etmək tövsiyə olunur, əks halda hər yenidən qoşulmada təyinat dəyişə bilər.

Tez-tez verilən suallar

Socket.IO yerli WebSocket-dən nə ilə fərqlənir?

Socket.IO adlandırılmış hadisələrlə hadisə modeli, avtomatik yenidən qoşulma, otaq dəstəyi və HTTP long-polling-ə fallback təmin edir. Yerli WebSocket minimal API ilə aşağı səviyyəli protokoldur və bu mexanikaların əl ilə tətbiqini tələb edir.

Socket.IO-nu Node.js olmadan istifadə etmək olarmı?

Bəli, Python (python-socketio), Java (netty-socketio), Go (go-socketio) və digər dillər üçün üçüncü tərəf implementasiyaları mövcuddur. socket.io-client müştərisi JavaScript, Swift, Kotlin və C++ üçün əlçatandır.

Socket.IO neçə eyni vaxtda bağlantını dəstəkləyir?

Socket.IO ilə bir Node.js prosesi 1 GB RAM ilə 100 000 bağlantıya qədər işləyə bilər. Redis adapteri və 4 serverlə klaster 400 000-ə qədər eyni vaxtda müştərini dəstəkləyir.

Socket.IO mobil platformaları dəstəkləyir?

Bəli, iOS üçün Swift-də rəsmi müştəri, Android üçün Java/Kotlin-də rəsmi müştəri mövcuddur. React Native üçün standart JavaScript socket.io-client müştərisi istifadə olunur.

Socket.IO bağlantısının təhlükəsizliyini necə təmin etmək olar?

HTTP/WS əvəzinə HTTPS/WSS istifadə edin, tokenlər (JWT) vasitəsilə autentifikasiya üçün middleware konfiqurasiya edin, validatorlar vasitəsilə gedən hadisələrə məhdudiyyət qoyun və DDoS-dan qorunmaq üçün rate limiting istifadə edin.

Nəticə

  • Socket.IO — WebSocket üzərində avtomatik HTTP long-polling fallback ilə ikitərəfli real-time əlaqə kitabxanası.
  • Hadisə modeli adlandırılmış hadisələr və ACK təsdiqləri ilə yerli WebSocket ilə müqayisədə inkişafı asanlaşdırır.
  • Otaqlar və ad sahələri müştəriləri qruplaşdırmağa və məntiqi rabitə kanallarını təcrid etməyə imkan verir.
  • Avtomatik yenidən qoşulma eksponensial gecikmə ilə mobil şəbəkələrdə sabitliyi təmin edir.
  • Üfüqi miqyaslanma tətbiq kodunu dəyişmədən Redis və ya MongoDB adapterləri vasitəsilə həyata keçirilir.
  • Adapterlər Pub/Sub brokerlər vasitəsilə proseslər arasında vəziyyətin bölüşdürülməsi problemini həll edir.
  • Sadə layihələr üçün minimal nəqliyyat tələbləri ilə yerli WebSocket-i, etibarlılıq tələb edən istehsal sistemləri üçün Socket.IO-nu seçin.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun