Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce bilgisayarınızda Node.js'in en güncel LTS (Long Term Support) sürümünün yüklü olduğundan emin olmalısınız. 2026 yılı standartlarına göre Node.js 22+ sürümünü kullanmanızı öneririm. Terminalinizi açın ve projeniz için bir klasör oluşturup gerekli paketleri yükleyin.
mkdir canli-anket-sistemi
cd canli-anket-sistemi
npm init -y
npm install express socket.io
Bu komutlar, projenizin temel yapılandırma dosyasını (package.json) oluşturacak ve web sunucusu için Express, gerçek zamanlı iletişim için ise Socket.io kütüphanelerini projenize dahil edecektir.
Sunucu Tarafında WebSocket Yapılandırması
Sunucu tarafında Express kullanarak bir HTTP sunucusu oluşturacağız ve bu sunucuyu Socket.io ile entegre edeceğiz. WebSocket protokolü, HTTP üzerinden bir el sıkışma (handshake) gerçekleştirerek kalıcı bir bağlantı kurar. Bu sayede sunucu, istemciye veriyi "push" edebilir.
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);
// Statik dosyaları servis et
app.use(express.static('public'));
io.on('connection', (socket) => {
console.log('Bir kullanıcı bağlandı: ' + socket.id);
socket.on('oy-ver', (secenek) => {
console.log('Yeni oy geldi:', secenek);
// Tüm istemcilere güncel durumu gönder
io.emit('anket-guncelle', secenek);
});
});
server.listen(3000, () => {
console.log('Sunucu http://localhost:3000 adresinde çalışıyor.');
});
Burada io.on('connection') bloğu, her yeni bağlantıda tetiklenir. İstemciden gelen 'oy-ver' mesajını dinliyor ve io.emit komutu ile bağlı olan tüm kullanıcılara güncellemeyi anlık olarak iletiyoruz.
İstemci Tarafı: Anket Arayüzü ve Socket Bağlantısı
İstemci tarafında, kullanıcıların oy verebileceği basit bir HTML yapısı ve Socket.io istemci kütüphanesini kullanacağız. public/index.html dosyasını oluşturarak başlayın.
Favori Programlama Diliniz Nedir?
JavaScript
Python
const socket = io();
function oyVer(dil) {
socket.emit('oy-ver', dil);
}
socket.on('anket-guncelle', (dil) => {
document.getElementById('sonuclar').innerHTML += '' + dil + ' için oy kullanıldı!
';
});
Bu kod bloğu, kullanıcının bir butona tıkladığında sunucuya veri göndermesini (emit) ve sunucudan gelen güncellemeleri dinleyerek (on) arayüzü güncellemesini sağlar.
Veri Yönetimi ve Güvenlik Önlemleri
Canlı anket sistemlerinde en büyük risk, aynı kullanıcının defalarca oy kullanarak sonuçları manipüle etmesidir. Bunu engellemek için basit bir "session" veya "IP bazlı" kısıtlama uygulanmalıdır. Ayrıca, XSS (Cross-Site Scripting) saldırılarına karşı gelen veriyi mutlaka temizleyin.
Güvenlik Uyarısı: Üretim ortamında (production) Socket.io bağlantılarını mutlaka CORS (Cross-Origin Resource Sharing) politikaları ile sınırlandırın. İstemciden gelen veriye asla doğrudan güvenmeyin; sunucu tarafında her zaman doğrulama yapın.
Aşağıdaki örnekte, basit bir nesne ile oyları sunucu tarafında nasıl tutacağımızı görebilirsiniz:
let anketSonuclari = { JavaScript: 0, Python: 0 };
io.on('connection', (socket) => {
socket.emit('ilk-durum', anketSonuclari);
socket.on('oy-ver', (secenek) => {
if (anketSonuclari.hasOwnProperty(secenek)) {
anketSonuclari[secenek]++;
io.emit('anket-guncelle', anketSonuclari);
}
});
});
Socket.io ile Gerçek Zamanlı Sistemlerin Karşılaştırılması
Gerçek zamanlı uygulamalar geliştirirken alternatif yöntemleri bilmek, mimari kararlarınızda size yardımcı olur.
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Socket.io | Otomatik yeniden bağlanma, kolay kullanım | Sunucu yükü daha fazladır |
| Native WebSockets | Düşük kaynak tüketimi | Hata yönetimi manueldir |
| Long Polling | Eski tarayıcı desteği | Yüksek gecikme, verimsiz |
Sıkça Sorulan Sorular
Socket.io her tarayıcıda çalışır mı?
Evet, Socket.io WebSocket protokolünü desteklemeyen tarayıcılarda otomatik olarak HTTP Long Polling yöntemine geçiş yapar, bu da geniş bir uyumluluk sağlar.
Canlı ankette veriler sunucu yeniden başladığında silinir mi?
Evet, yukarıdaki örnekte veriler RAM üzerinde tutulmaktadır. Kalıcı olması için Redis veya MongoDB gibi bir veritabanı kullanmalısınız.
Aynı anda binlerce kişi oy verirse sunucu çöker mi?
Node.js tek iş parçacıklı (single-threaded) yapısı sayesinde binlerce bağlantıyı yönetebilir ancak ölçeklenebilirlik için Redis Pub/Sub kullanarak Socket.io sunucularını kümelemeniz (clustering) gerekir.
Neden Socket.io yerine HTTP POST kullanmıyoruz?
HTTP POST istekleri tek yönlüdür. Sunucunun güncellemeyi tüm kullanıcılara anlık göndermesi için her kullanıcının sürekli sunucuya soru sorması (polling) gerekir, bu da sunucuyu yorar.
Güvenlik için Socket.io'da token doğrulaması nasıl yapılır?
Bağlantı kurulurken io.use((socket, next) => { ... }) ara katmanını (middleware) kullanarak JWT (JSON Web Token) doğrulaması yapabilirsiniz.
Canlı Anket Sisteminde Performans Optimizasyonu ve Ölçeklendirme
Uygulamanızın kullanıcı sayısı arttıkça, tek bir Node.js örneği (instance) darboğaz oluşturmaya başlayabilir. Socket.io ile ölçeklenebilir bir yapı kurmak için "Redis Adapter" kullanmak standart bir yaklaşımdır. Bu sayede birden fazla sunucu örneği arasında mesajlaşma senkronize edilir.
Performansı artırmak için şu adımları izleyebilirsiniz:
- Event Throttling: Kullanıcıların saniyede onlarca kez oy göndermesini engellemek için istemci tarafında bir "debounce" mekanizması kurun.
- Payload Sıkıştırma: Socket.io konfigürasyonunda
perMessageDeflateözelliğini aktif ederek ağ trafiğini azaltın. - Redis ile Durum Yönetimi: Anket sonuçlarını RAM yerine Redis üzerinde tutarak sunucu restart işlemlerinde veri kaybını önleyin.
// Sunucu tarafında Redis Adapter kullanımı
const { createClient } = require('redis');
const { createAdapter } = require('@socket.io/redis-adapter');
const pubClient = createClient({ url: 'redis://localhost:6379' });
const subClient = pubClient.duplicate();
io.adapter(createAdapter(pubClient, subClient));
Üretim Ortamına (Production) Geçiş ve Deployment Stratejileri
Uygulamanızı yerel geliştirme ortamından canlıya taşırken, güvenlik ve süreklilik için bazı kritik yapılandırmalar yapmanız gerekir. Özellikle Node.js süreçlerini yönetmek için PM2 gibi bir süreç yöneticisi kullanmak zorunludur.
PM2 ile Süreç Yönetimi
PM2, uygulamanızın çökmesi durumunda otomatik olarak yeniden başlatılmasını sağlar ve CPU çekirdeklerini verimli kullanmak için "Cluster Mode" desteği sunar.
# PM2 kurulumu
npm install pm2 -g
# Uygulamayı cluster modunda başlatma
pm2 start server.js -i max
Nginx ile Reverse Proxy Yapılandırması
Socket.io bağlantıları için Nginx üzerinde "Upgrade" başlıklarını doğru yapılandırmanız gerekir. Aksi takdirde WebSocket bağlantısı kurulamayabilir ve sistem HTTP polling moduna düşer.
location /socket.io/ {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
}
Güvenlik Kontrol Listesi
| Güvenlik Önlemi | Açıklama |
|---|---|
| CORS Sınırlaması | Socket.io konfigürasyonunda origin alanını sadece kendi alan adınızla kısıtlayın. |
| Rate Limiting | Aynı IP adresinden gelen bağlantı isteklerini express-rate-limit ile sınırlayın. |
| Input Sanitization | Kullanıcıdan gelen anket verilerini mutlaka sunucu tarafında doğrulayın (Joi veya Zod kütüphaneleri ile). |
Bu yapılandırmalar, basit bir anket uygulamasını profesyonel seviyede, binlerce eş zamanlı kullanıcıyı destekleyebilecek bir altyapıya dönüştürmenize olanak tanır. Özellikle production ortamında NODE_ENV=production değişkenini kullanmayı unutmayın.
Sonuç
Node.js ve Socket.io kullanarak canlı anket sistemi geliştirmek, gerçek zamanlı web uygulamalarının temellerini anlamak için harika bir başlangıçtır. Bu projeyi bir adım öteye taşımak için sonuçları bir veritabanına kaydetmeyi, kullanıcıları IP adreslerine göre kısıtlamayı ve şık bir grafik kütüphanesi (Chart.js gibi) ile sonuçları görselleştirmeyi deneyebilirsiniz.
Yasal Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Ticari veya yüksek trafikli projelerde veri güvenliği, yetkilendirme ve sunucu optimizasyonu için profesyonel güvenlik standartlarını (OWASP vb.) takip etmeniz gerekmektedir.
Bir sonraki adım olarak, uygulamanızı bir bulut sunucusuna (VPS) taşıyarak gerçek kullanıcılarla test etmenizi öneririm. Başarılar dilerim.


Yorumlar (0)
Yorum Yaz