Node.js İle Socket.io Kullanarak Gerçek Zamanlı Grup Sohbeti Nasıl Yapılır?

Node.js İle Socket.io Kullanarak Gerçek Zamanlı Grup Sohbeti Nasıl Yapılır?
Node.js İle Socket.io Kullanarak Gerçek Zamanlı Grup Sohbeti Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Başarılı bir geliştirme süreci için sisteminizde Node.js'in en güncel LTS (Long Term Support) sürümünün kurulu olması gerekir. 2026 yılı standartlarında, 20.x veya üzeri bir sürüm kullanmanızı öneriyoruz. Ayrıca paket yönetimi için npm veya pnpm kullanabilirsiniz.

  • Node.js (v20+)
  • Temel JavaScript (ES6+ sözdizimi)
  • Terminal kullanımı
  • Bir kod editörü (VS Code önerilir)

Projenizi başlatmak için boş bir klasör oluşturun ve terminalde şu komutları çalıştırarak gerekli bağımlılıkları yükleyin:

mkdir grup-sohbeti
cd grup-sohbeti
npm init -y
npm install express socket.io

Bu komutlar, projenin yapılandırma dosyasını (package.json) oluşturacak ve HTTP sunucusu için Express ile gerçek zamanlı iletişim için Socket.io kütüphanesini projenize dahil edecektir.

Sunucu Tarafında Socket.io Kurulumu

Sunucu tarafında Socket.io'yu yapılandırmak, gelen bağlantıları dinlemek ve olayları (events) yönetmek için temel adımdır. Express HTTP sunucusu ile Socket.io'yu birleştirerek WebSocket protokolü üzerinden veri alışverişi başlatacağız.

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);

io.on('connection', (socket) => {
    console.log('Yeni bir kullanıcı bağlandı: ' + socket.id);

    socket.on('chat message', (msg) => {
        io.emit('chat message', msg); // Tüm bağlı kullanıcılara mesajı gönder
    });

    socket.on('disconnect', () => {
        console.log('Kullanıcı ayrıldı');
    });
});

server.listen(3000, () => {
    console.log('Sunucu http://localhost:3000 adresinde çalışıyor');
});

Burada io.on('connection') bloğu, her yeni bağlantıda tetiklenir. io.emit metodu ise o an bağlı olan tüm istemcilere veriyi yayınlamak için kullanılır.

İstemci Tarafında Mesajlaşma Arayüzü

İstemci tarafında, kullanıcının mesaj yazıp gönderebileceği ve gelen mesajları görebileceği basit bir HTML yapısına ihtiyacımız var. Socket.io'nun istemci kütüphanesini CDN üzerinden dahil ederek bağlantıyı sağlayacağız.




    
    Gönder const socket = io(); const form = document.getElementById('form'); const input = document.getElementById('input'); form.addEventListener('submit', (e) => { e.preventDefault(); if (input.value) { socket.emit('chat message', input.value); input.value = ''; } }); socket.on('chat message', (msg) => { const item = document.createElement('li'); item.textContent = msg; document.getElementById('messages').appendChild(item); });

    Bu kod, kullanıcının gönderdiği mesajı sunucuya iletir ve sunucudan gelen mesajları listeye ekler. socket.emit ile veri gönderilirken, socket.on ile veri dinlenir.

    Grup Sohbeti İçin Odalar (Rooms) Mantığı

    Gerçek bir grup sohbetinde, herkesin her mesajı görmesi yerine belirli gruplara (odalar) ayrılmış mesajlaşma daha verimlidir. Socket.io'nun join metodu ile kullanıcıları belirli odalara dahil edebilirsiniz.

    io.on('connection', (socket) => {
        socket.on('join room', (roomName) => {
            socket.join(roomName);
            console.log(`Kullanıcı ${roomName} odasına katıldı.`);
        });
    
        socket.on('chat message', ({ room, message }) => {
            io.to(room).emit('chat message', message);
        });
    });

    Bu yapı sayesinde io.to(room).emit kullanarak sadece o odaya dahil olan kullanıcıların mesajı almasını sağlarsınız. Bu, ölçeklenebilir bir grup sohbeti mimarisinin temelidir.

    Gerçek Zamanlı Uygulama Yöntemleri Karşılaştırması

    Yöntem Avantaj Dezavantaj
    Polling (Düzenli İstek) Basit yapı Yüksek sunucu yükü, gecikme
    Long Polling Daha iyi tepki süresi Bağlantı kopmaları
    Socket.io (WebSocket) Gerçek zamanlı, çift yönlü Sunucu tarafında durum yönetimi

    Güvenlik ve Üretim Ortamı Uyarıları

    Kritik Güvenlik Uyarısı: Üretim ortamında (production) Socket.io kullanırken mutlaka CORS (Cross-Origin Resource Sharing) ayarlarını kısıtlayın. Kullanıcıdan gelen mesajları doğrudan HTML içine gömmeyin; XSS (Cross-Site Scripting) saldırılarına karşı verileri mutlaka temizleyin (sanitize edin). Kullanıcı girdilerini asla olduğu gibi DOM'a eklemeyin, textContent veya güvenli kütüphaneler kullanın.

    Sıkça Sorulan Sorular

    Socket.io ile WebSocket arasındaki fark nedir?

    Socket.io, WebSocket protokolünü temel alan ancak bağlantı koptuğunda otomatik yeniden bağlanma, oda yönetimi ve fallback (WebSocket desteklenmiyorsa HTTP polling'e dönme) gibi ek özellikler sunan bir kütüphanedir.

    Aynı anda binlerce kullanıcıyı nasıl yönetebilirim?

    Tek bir sunucu yerine Redis Adapter kullanarak Socket.io sunucularını ölçeklendirebilirsiniz. Bu, farklı sunuculardaki kullanıcıların birbirleriyle mesajlaşmasına olanak tanır.

    Mesajları veritabanına nasıl kaydederim?

    Socket.io olaylarını dinlediğiniz fonksiyonun içerisinde, mesajı veritabanına (MongoDB, PostgreSQL vb.) kaydetmek için bir veritabanı sürücüsü kullanmalı ve işlem başarılı olduktan sonra emit yapmalısınız.

    Özel mesajlaşma (Private Messaging) nasıl yapılır?

    Her kullanıcının benzersiz bir socket ID'si vardır. Bir kullanıcıya özel mesaj göndermek için io.to(socketId).emit(...) yöntemini kullanabilirsiniz.

    Bağlantı koptuğunda ne olur?

    Socket.io, istemci tarafında otomatik olarak yeniden bağlanmaya çalışır. Sunucu tarafında ise disconnect olayı tetiklenerek kullanıcının çevrimdışı olduğu bilgisi işlenebilir.

    Socket.io Uygulamalarında Performans Optimizasyonu ve Ölçeklendirme

    Gerçek zamanlı uygulamalar büyüdükçe, sunucu üzerindeki yük doğrusal olmayan bir şekilde artabilir. Socket.io ile yüksek trafikli bir sohbet uygulaması yönetirken, tek bir sunucunun sınırlarına ulaştığınızda yatay ölçeklendirme (horizontal scaling) kaçınılmaz hale gelir. Bu noktada Redis Adaptörü kullanımı, birden fazla sunucu örneği arasında mesajların senkronize edilmesini sağlar.

    Performansı artırmak için dikkat etmeniz gereken temel stratejiler şunlardır:

    • Binary Veri Transferi: Mesajlaşma sırasında büyük dosyalar veya görseller göndermeniz gerekiyorsa, bunları Base64 formatında değil, Buffer veya Blob nesneleri olarak göndererek işlemci yükünü azaltın.
    • Namespace Kullanımı: Uygulamanızın farklı bölümleri (örneğin: genel sohbet, bildirimler, oyun verileri) için ayrı namespace'ler oluşturun. Bu, olayların (events) gereksiz yere tüm istemcilere yayınlanmasını engeller.
    • Volatile (Uçucu) Mesajlar: Eğer bir mesajın mutlaka ulaşması gerekmiyorsa (örneğin: "kullanıcı yazıyor..." bilgisi), volatile bayrağını kullanarak ağ trafiğini optimize edebilirsiniz.
    // Volatile mesaj örneği: Bağlantı koptuğunda bu mesaj tekrar gönderilmez
    socket.volatile.emit('typing', { user: 'Ahmet' });

    Socket.io Uygulamalarında Hata Ayıklama (Debugging) Teknikleri

    Gerçek zamanlı sistemlerde hata ayıklamak, geleneksel HTTP istek-cevap döngüsüne göre daha karmaşıktır. İstemci ve sunucu arasındaki bağlantı kopukluklarını veya olayların tetiklenmemesini çözmek için Socket.io'nun dahili hata ayıklama modunu kullanabilirsiniz.

    Geliştirme aşamasında terminalinizde şu komutu kullanarak tüm WebSocket trafiğini izleyebilirsiniz:

    # Linux/macOS
    DEBUG=socket.io:* node server.js
    
    # Windows (PowerShell)
    $env:DEBUG="socket.io:*"; node server.js

    Yaygın Karşılaşılan Hata Senaryoları

    Hata Belirtisi Olası Neden Çözüm
    Polling error (404) Sunucu ve istemci versiyon uyumsuzluğu package.json dosyasından her iki taraftaki sürümü eşitleyin.
    WebSocket connection failed CORS ayarları veya Proxy yapılandırması Sunucu tarafında cors: { origin: "*" } ayarını kontrol edin.
    Memory Leak (Bellek Sızıntısı) Kapatılmayan event listener'lar socket.off('event', handler) ile dinleyicileri temizleyin.

    Özellikle socket.on ile tanımladığınız olay dinleyicilerini, kullanıcı odadan ayrıldığında veya bağlantı koptuğunda socket.removeListener veya socket.off metodları ile kaldırmayı unutmayın. Aksi takdirde, her yeniden bağlanma durumunda bellekte aynı olay için birden fazla dinleyici birikecek ve uygulamanızın yavaşlamasına neden olacaktır.

    Sonuç

    Node.js ve Socket.io kullanarak gerçek zamanlı bir grup sohbeti oluşturmak, modern web uygulamalarının temelini anlamak için mükemmel bir başlangıçtır. Bu rehberde, bağlantı kurma, odalara ayırma ve mesaj iletimi süreçlerini öğrendiniz. Bir sonraki adım olarak, kullanıcı kimlik doğrulaması (JWT kullanarak) ekleyerek mesajların kimin tarafından gönderildiğini doğrulamayı deneyebilirsiniz.

    Not: Bu içerik eğitim amaçlıdır. Canlı projelerde her zaman güncel güvenlik yamalarını takip edin ve kullanıcı girdilerini doğrulamayı ihmal etmeyin.

    Bu yazıya tepkinizi paylaşın:
    Deniz Arslan

    On yıllık içerik üretim deneyimiyle karmaşık süreçleri herkesin anlayabileceği pratik rehberlere dönüştürüyorum. Günlük yaşamı kolaylaştıran çözümler üzerine uzmanlaşmış bir editörüm.

    Yorumlar (0)

    Yorum Yaz