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, 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ı.
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 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, 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, 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 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.
| Özellik | Socket.IO | WebSocket |
|---|---|---|
| Taşıma | WebSocket + HTTP long-polling (geri dönüş) | Yalnızca WebSocket |
| Olay modeli | JSON yüküyle adlandırılmış olaylar | Yalnızca metin/ikili çerçeveler |
| Odalar | Yerleşik soket gruplama | Manuel uygulama gerektirir |
| Otomatik yeniden bağlanma | Yerleşik | Manuel uygulama gerektirir |
| Teslimat onayı | Geri çağırmalı ACK mekanizması | Protokol uzantılarıyla kullanılabilir |
| Ölçeklendirme | Adaptö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.
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.
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');
});
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 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.
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');
});
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.
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 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.
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 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.
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.
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
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.