Socket.IO — gerçek zamanlı etkileşim kütüphanesi nedir

Yazar: IT Sectr Yayınlanma: 2026-06-01 Okuma süresi: 8 dk

Socket.IO, otomatik geri dönüşlü WebSocket tabanlı, istemci ve sunucu arasında çift yönlü gerçek zamanlı iletişim için bir kütüphanedir. Sohbetlerde, oyunlarda ve işbirlikçi düzenleyicilerde anlık veri aktarımı için güvenilir bir taşıma sağlar. Resmi Socket.IO dokümantasyonuna (2024) göre, kütüphane uygun yapılandırmayla tek bir sunucuda bir milyondan fazla bağlantıyı işler.

Önemli Noktalar

  • Socket.IO — WebSocket ve HTTP long-polling üzerinde çalışan gerçek zamanlı iletişim kütüphanesidir.
  • Çift yönlü iletişim — hem istemci hem de sunucu her an veri göndermeye başlayabilir.
  • Otomatik geri dönüş — WebSocket kullanılamadığında kod değişikliği olmadan HTTP long-polling'e geçer.
  • Odalar ve ad alanları — hedefli mesaj iletimi için bağlantıların gruplandırılması.
  • Olay tabanlı model — rastgele yüklerle adlandırılmış olaylar aracılığıyla veri alışverişi.

Socket.IO Nedir?

Socket.IO, istemci ve sunucu arasında çift yönlü olay odaklı iletişim için açık kaynaklı bir JavaScript kütüphanesidir. 2010 yılında geliştirici Guillermo Rauch tarafından oluşturuldu ve o zamandan beri Node.js üzerinde gerçek zamanlı uygulamalar için fiili standart haline geldi.

Yerel WebSocket API'sinden farklı olarak Socket.IO, ek soyutlamalar sağlar: odalar, ad alanları, otomatik yeniden bağlanma ve ikili veri türleri. Kütüphane, WebSocket'in ayrı bir uygulaması değildir — taşıma katmanı olarak Engine.IO'yu kullanır; önce bir HTTP long-polling bağlantısı kurar, ardından WebSocket'e yükseltmeyi dener.

npm istatistiklerine (2025) göre, socket.io paketinin haftalık 12 milyondan fazla kopyası indirilmekte ve bu onu Node.js ekosistemindeki en popüler kütüphanelerden biri yapmaktadır. Socket.IO tüm modern platformlarda desteklenir: tarayıcılar, iOS, Android, React Native ve masaüstü uygulamaları.

Tarihçe ve Sürümler

Socket.IO sürüm 1.0, 2014 yılında yayınlandı ve tek bir TCP bağlantısı üzerinden birden fazla mantıksal kanalı çoğullamaya izin veren ad alanları kavramını tanıttı. Sürüm 2.0 (2017), ikili veri desteği ekledi ve ayrıştırma performansını iyileştirdi. Mevcut sürüm 4.x (2020–2025), tam TypeScript desteği, ölçeklendirme için amiral gemisi adaptör modu ve geliştirilmiş geriye dönük uyumluluk içerir.

Her büyük sürüm API geriye dönük uyumluluğunu korur — bir socket.io@2 istemcisi, özel bir uyumluluk modu aracılığıyla bir socket.io@4 sunucusuna bağlanabilir. Bu, istemci tarafı yükseltmelerinin kademeli olarak gerçekleştiği uzun ömürlü projeler için önemlidir.

Socket.IO Nasıl Çalışır

Socket.IO mimarisi iki bileşenden oluşur: sunucu modülü (npm paketi socket.io) ve istemci modülü (npm paketi socket.io-client). Sunucu, bir Node.js HTTP(S) sunucusu üzerinde çalışır ve taşıma katmanını yönetmek için Engine.IO'yu kullanır.

İlk bağlantıda istemci, sunucuya bir HTTP isteği gönderir. Engine.IO yanıt verir ve bir long-polling bağlantısı kurar. Bundan sonra istemci, taşıma protokolünü WebSocket'e yükseltmek için bir istek gönderir. Sunucu WebSocket'i destekliyorsa, yükseltme tek bir TCP oturumu içinde gerçekleşir. Desteklemiyorsa, bağlantı long-polling olarak kalır ve uygulama kodunda değişiklik gerekmez.

Socket.IO performans testlerine (2024) göre, WebSocket kullanıldığında gecikme mesaj iletimi başına 2–5 ms iken, long-polling HTTP yükü nedeniyle 150–300 ms ekler. Taşıma seçimi geliştirici için şeffaftır.

Engine.IO Protokolü

Engine.IO, Socket.IO'nun üzerine inşa edildiği düşük seviyeli taşıma katmanıdır. Bağlantı kurma, taşıma seçimi, heartbeat (ping/pong) ve bağlantı sonlandırmayı yönetir. Başlıca Engine.IO paket türleri şunlardır: open (başlatma), close (kapatma), ping/pong (canlı tutma), upgrade (taşıma değişikliği) ve message (veri).

Socket.IO, Engine.IO üzerinde kendi olay odaklı modelini oluşturur — geliştiricinin çalıştığı şey budur. Her Socket.IO mesajı, teslimat onayı için benzersiz bir tanımlayıcıyla birlikte Engine.IO paketine sarılır.

Socket.IO'nun Temel Özellikleri

Socket.IO, yerel WebSocket API'sinde bulunmayan ve gerçek zamanlı uygulama geliştirmeyi önemli ölçüde kolaylaştıran bir dizi özellik sunar. Başlıcalarına bakalım.

Otomatik yeniden bağlanma — istemci, bağlantı kesildiğinde üstel geri alma (100 ms, 200 ms, 400 ms... maksimuma kadar) ile bağlantıyı otomatik olarak geri yükler. Socket.IO dokümantasyonuna (2024) göre, yeniden deneme ayarları reconnectionDelay ve reconnectionAttempts parametreleri aracılığıyla kullanılabilir. Bu seçenek, ağ değişiklikleri sırasında bağlantının kesilebileceği mobil uygulamalar için kritiktir.

Oda desteği — sunucu, soketleri odalarda gruplayabilir ve mesajları yalnızca belirli bir odanın katılımcılarına gönderebilir. Odalar açık oluşturma gerektirmez — ilk soket katıldığında oluşturulurlar. Odalar, işlem düzeyinde uygulanır ve özel bir adaptör olmadan farklı sunucular arasında paylaşılmaz.

Ad alanları — tek bir bağlantı üzerinde iletişim kanallarının mantıksal olarak ayrılmasıdır. Örneğin, sohbet mesajları için /chat ad alanı ve bildirimler için /notifications ad alanı. Her ad alanının kendi odaları, middleware'i ve işleyicileri vardır. Ad alanları, tek bir TCP bağlantısı üzerinden çoğullanarak kaynak tasarrufu sağlar.

Teslimat onayı — mesaj gönderirken, sunucu alımı onayladığında çağrılacak bir geri çağırma işlevi iletilebilir. Bu, her paket için benzersiz bir tanımlayıcı aracılığıyla uygulanır. Onay mekanizması, kritik öneme sahip mesajların (örneğin, ödeme işlemleri) alıcıya iletilmesini garanti eder.

Socket.IO vs WebSocket: Karşılaştırma

Socket.IO ve yerel WebSocket arasındaki seçim proje gereksinimlerine bağlıdır. WebSocket, tüm modern tarayıcılar tarafından desteklenen standartlaştırılmış bir protokoldür (RFC 6455). Socket.IO, WebSocket'i taşıma olarak kullanan ancak ek özellikler ekleyen bir kütüphanedir.

ÖzellikSocket.IOWebSocket
TaşımaWebSocket + HTTP long-polling (geri dönüş)Yalnızca WebSocket
Olay modeliJSON yüküyle adlandırılmış olaylarYalnızca metin/ikili çerçeveler
OdalarYerleşik soket gruplamaManuel uygulama gerektirir
Otomatik yeniden bağlanmaYerleşikManuel uygulama gerektirir
Teslimat onayıGeri çağırmalı ACK mekanizmasıProtokol uzantılarıyla kullanılabilir
ÖlçeklendirmeAdaptörler (Redis, MongoDB, Cluster)Özel altyapı gerektirir
Kütüphane boyutu~50 KB (istemci, gzip)Tarayıcıya yerleşik (0 KB)

Projeniz maksimum performans ve minimum istemci boyutu gerektiriyorsa — yerel WebSocket'i seçin. Güvenilir teslimat, gruplama ve olay odaklı bir modele ihtiyacınız varsa — Socket.IO, hazır soyutlamalar sayesinde geliştirme süresini 2–3 kat azaltacaktır.

State of JS 2024 anketine göre, gerçek zamanlı uygulama geliştiricilerinin %67'si, kullanışlı API'si ve uç durumların (ağ kopması, yeniden bağlanma, ikili veri) yerleşik yönetimi nedeniyle Socket.IO'yu tercih etmektedir.

Bir Projede Socket.IO Nasıl Bağlanır

Socket.IO'yu kurmak iki paket gerektirir: sunucu tarafı ve istemci tarafı. Bir Node.js projesi için temel kuruluma bakalım. Sunucu bir HTTP sunucusu oluşturur, Socket.IO'yu başlatır ve istemci bağlantı ve bağlantı kesme olaylarını işler.

Socket.IO dokümantasyonuna (2024) göre, sunucu yerleşik http modülü kullanılarak Express olmadan başlatılabilir, ancak gerçek projelerde HTTP istek yönlendirmesi için genellikle Express veya Fastify kullanılır.

Node.js'de Sunucu Tarafı 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('İstemci bağlandı:', socket.id);

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

    socket.on('disconnect', () => {
        console.log('İstemci bağlantısı kesildi');
    });
});

server.listen(3000, () => {
    console.log('Sunucu 3000 portunda çalışıyor');
});

Tarayıcıda İstemci Tarafı 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 Olaylar ve Odalar

Socket.IO olay modeli adlandırılmış olaylara dayanır. Sunucu ve istemci, belirli bir olay adına bağlı mesajlar gönderir ve alır. Yük, bir dize, JSON nesnesi veya ikili veri (Buffer, ArrayBuffer, Blob) olabilir.

Her olay ACK (onay) destekler — alıcı tarafından olay işlendikten sonra gönderen tarafında yürütülen bir geri çağırma işlevi iletmek. Bu, olay modeli üzerinde istek-yanıt deseninin uygulanmasına olanak tanır. ACK yalnızca alıcı geri çağırmayı açıkça çağırırsa çalışır.

Socket.IO dokümantasyonuna (2024) göre, optimum performans için tek bir mesajın maksimum boyutu 1 MB'ı geçmemelidir. Daha büyük mesajlar parçalara bölünmeli veya ayrı bir kanal üzerinden gönderilmelidir.

Odalarla Çalışma

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 Ölçeklendirilmesi

Yatay ölçeklendirme, birden fazla sunucu işlemi arasında durum paylaşımı sorununu çözmeyi gerektirir. Odalar, ad alanları ve bağlı soketlerin listesi tek bir işlemin belleğinde depolanır ve bir adaptör olmadan diğer işlemler tarafından görülmez.

Resmi Socket.IO adaptörleri: redis (Redis Pub/Sub aracılığıyla), mongodb (MongoDB change streams aracılığıyla), cluster (Node.js cluster çoklu işlem modu için). Adaptör, Socket.IO örnekleri arasında mesaj aracısı olarak görev yapar. Bir odaya olay gönderildiğinde, adaptör bunu Redis'te yayınlar ve tüm sunucular bildirimi alır.

Socket.IO yük testlerine (2024) göre, Redis adaptörlü 4 sunuculuk bir küme, 10 ms'nin altında gecikmeyle 400.000 eşzamanlı bağlantıyı işler. Adaptör olmadan, tek bir Node.js işleminin maksimum kapasitesi 1 GB bellek ile yaklaşık 100.000 bağlantıdır.

Redis Adaptör Yapılandırması

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 veya Docker Swarm kullanırken, aynı istemciden gelen isteklerin aynı sunucuya gitmesi için oturum yakınlığı (yapışkan oturumlar) yapılandırılması önerilir; aksi takdirde her yeniden bağlanmada atama değişebilir.

Sıkça Sorulan Sorular

Socket.IO, yerel WebSocket'ten nasıl farklıdır?

Socket.IO adlandırılmış olaylarla bir olay modeli, otomatik yeniden bağlanma, oda desteği ve HTTP long-polling'e geri dönüş sağlar. Yerel WebSocket, minimum API'ye sahip düşük seviyeli bir protokoldür ve bu mekanizmaların manuel olarak uygulanmasını gerektirir.

Socket.IO Node.js olmadan kullanılabilir mi?

Evet, Python (python-socketio), Java (netty-socketio), Go (go-socketio) ve diğer diller için sunucu tarafının üçüncü taraf uygulamaları mevcuttur. socket.io-client, JavaScript, Swift, Kotlin ve C++ için kullanılabilir.

Socket.IO kaç eşzamanlı bağlantıyı kaldırabilir?

Socket.IO ile tek bir Node.js işlemi, 1 GB RAM ile 100.000 bağlantıya kadar işlem yapar. Redis adaptörü ve 4 sunucuyla küme, 400.000'e kadar eşzamanlı istemciyi işleyebilir.

Socket.IO mobil platformları destekliyor mu?

Evet, iOS için Swift'te resmi bir istemci, Android için Java/Kotlin'de bir istemci vardır. React Native için standart JavaScript socket.io-client kullanılır.

Socket.IO bağlantı güvenliği nasıl sağlanır?

HTTP/WS yerine HTTPS/WSS kullanın, tokenlar (JWT) aracılığıyla kimlik doğrulama için middleware yapılandırın, doğrulayıcılar aracılığıyla giden olay sınırları belirleyin ve DDoS koruması için hız sınırlaması kullanın.

Özet

  • Socket.IO WebSocket üzerine inşa edilmiş ve HTTP long-polling'e otomatik geri dönüşlü, çift yönlü gerçek zamanlı iletişim kütüphanesidir.
  • Olay odaklı model ve adlandırılmış olaylar ile ACK onayları, yerel WebSocket'e kıyasla geliştirmeyi basitleştirir.
  • Odalar ve ad alanları istemcileri gruplamaya ve mantıksal iletişim kanallarını izole etmeye olanak tanır.
  • Otomatik yeniden bağlanma üstel geri alma ile mobil ağlarda kararlılık sağlar.
  • Yatay ölçeklendirme uygulama kodu değiştirilmeden Redis veya MongoDB adaptörleri aracılığıyla uygulanır.
  • Adaptörler Pub/Sub brokerları aracılığıyla işlemler arasında durum paylaşımı sorununu çözer.
  • Basit projeler için minimum taşıma gereksinimleriyle yerel WebSocket'i seçin; güvenilirlik gerektiren üretim sistemleri için Socket.IO'yu seçin.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun