İçeriğe Geç
Tüm Yazılar

Gerçek Zamanlı4 Dakika Okuma

İlk Sohbet Uygulamam: 2021’den Bugüne Ne Değişti

2021’de yazdığım ilk sohbet uygulamasının sunucusu on beş satırdı ve mesajın kimden geldiğini tarayıcı söylüyordu. Beş yıl sonra bir çizim oyununda aynı soruya bambaşka bir cevap verdim.

Bu Yazıda5 Bölüm

Haziran 2021’de ilk sohbet uygulamamı yazdım: React ile bir arayüz, Express ve Socket.io ile bir sunucu. Mesaj yazıyorsun, aynı sayfayı açmış herkes anında görüyor. Sunucu on beş satırdı ve tek bir iş yapıyordu: gelen her mesajı herkese geri yollamak. Mesajın kimden geldiğini ise tarayıcı söylüyordu. Beş yıl sonra Karalama’yı yazarken aynı soruya bambaşka bir cevap verdim ve bu yazı o iki cevabın karşılaştırması.

Eski kodu yeniden açmak biraz utandırıcı, biraz da öğretici. O dönem öğrenmek için yazdığım iki küçük projeye bugünkü gözle bakınca, aradaki farkın teknoloji değil tek bir soru olduğunu gördüm: kararı kim veriyor?

Sunucu Yalnızca Yankı Yapıyordu

Sunucunun tamamı buydu:

server.js
io.on("connection", socket => {
    socket.emit("your id", socket.id);
    socket.on("send message", body => {
        io.emit("message", body)
    })
})

Bağlanan her tarayıcıya kendi kimliğini söylüyor, sonra gelen mesajı olduğu gibi herkese yayıyor. Tarayıcı tarafı mesajı şöyle kuruyordu:

client/src/App.js
function sendMessage(e) {
  e.preventDefault();
  const messageObject = { body: message, id: yourID };
  setMessage("");
  socketRef.current.emit("send message", messageObject);
}

Mesajın sahibini tarayıcı yazıyor. Sunucu gerçek kimliği zaten biliyordu, elinin altındaydı, ama kullanmıyordu. Mesajın ekranda sağa mı sola mı düşeceğine de yine tarayıcı karar veriyordu. Yani biri başkasının kimliğiyle mesaj atsaydı, o mesaj karşı tarafın ekranında sanki kendi yazmış gibi görünürdü. Uygulama yine de çalışıyordu; sohbette herkes kendi adıyla yazdığı sürece kimin haklı olduğuna karar verecek bir sunucuya gerek kalmıyor.

Bir Ay Önce: Firebase

Bundan bir ay önce de React, Tailwind ve Firebase ile bir Twitter klonu yazmıştım. Orada hiç sunucu kodu yoktu; tarayıcı doğrudan Firestore’a yazıyor, akışı da oradan dinliyordu.

src/components/TweetBox.js
db.collection('feed').add({
    displayName: "Ahmet Akyapı",
    username: "@Ahmetakyapi",
    content,
    timestamp: firebase.firestore.FieldValue.serverTimestamp(),
})

Burada da kim olduğunu tarayıcı söylüyor; adım ve kullanıcı adım koda gömülü. Kimin yazabileceğine karar verecek tek yer Firestore’un güvenlik kurallarıydı ve depoda kural dosyası yok. Sunucunun karar verdiği tek şey zamandı: zaman damgası sunucudan geldiği için sıralama tarayıcının saatine kalmıyordu.

2021’deki iki projemde sunucunun karar verdiği tek şey saatti. Birinde o bile değil.

Beş Yıl Sonra: Karalama

Karalama arkadaşlarla oynanan bir çizim ve tahmin oyunu. Orada bu soru en baştan karşıma çıktı, çünkü oyunun kendisi üç karara dayanıyor: tahmin doğru mu, cevabı kim biliyor, puanı kim veriyor. Üçünün de cevabı sunucu.

apps/server/src/game/Room.ts
handleGuess(playerId: string, text: string) {
  if (this.phase !== 'DRAWING') return null;
  if (playerId === this.currentDrawerId) return null;

  const normalized = normalizeGuess(text);
  const answer = normalizeGuess(this.currentWord);

  if (normalized === answer) {
    const score = calculateGuesserScore({ /* ... */ });
    // ...
  }
}

Tahmin sohbetten düz metin olarak geliyor ve oyuncunun kimliği mesajın içinden değil, bağlantının kendisinden okunuyor. Kelime tahmin edenlere tur boyunca hiç gönderilmiyor; onlara yalnızca ipucu ve harf sayısı gidiyor. Puanı da sunucu hesaplıyor. 2021’de tarayıcının yazdığı kimlik alanının yerini burada bağlantının kimliği aldı.

Firebase’de Aynısı Nasıl Olurdu

Firebase’de veritabanı veriyi tutar, karar vermez. Güvenlik kuralları “bu kullanıcı kendi adına mı yazıyor” sorusunu cevaplayabilir; Twitter klonunda eksik olan da buydu. “Bu tahmin doğru mu” sorusu başka. Doğru cevap okunabilir bir yerde duruyorsa tarayıcı onu okur. Okunamaz bir yere koyarsan, karşılaştırmayı yapacak bir sunucu fonksiyonu gerekir. Sonunda yine sunucu kodu yazıyorsun, sadece başka bir yerde.

Bugün Hangisini Seçerdim

Artık tek bir soruya bakıyorum: sunucu, tarayıcının bilmemesi gereken bir şey tutuyor mu?

  1. Tutmuyorsa, Hazır Bir Gerçek Zamanlı Veritabanı

    Sohbet, bildirim, canlı sayaç, ortak liste. Herkes her şeyi görebilir; kurallar yalnızca kimin neyi yazabileceğini sınırlar. Böyle bir işte kendi sunucunu yazmak boşa emek.

  2. Tutuyorsa, Kendi Sunucun

    Oyun mantığı, gizli kalması gereken bilgi, sunucuda işleyen zamanlayıcı, hileye karşı kontrol. Kararı veren kod senin elinde olmalı.

2021’deki iki projede bu soruya verilmiş bir cevap yok. İkisi de çalıştı, çünkü ikisinde de saklanacak bir şey yoktu. Karalama’da saklanması gereken ilk şey bir kelimeydi ve sunucu o kelimenin etrafında kuruldu. Bir sonraki projede saklanacak şeyin ne olacağını henüz bilmiyorum; bu kez onu kodun ilk gününde görmek istiyorum.

Diğer Yazılar

Tüm Yazılar
  1. Karalama: Arkadaşlarla Oynanan Çizim Oyunu15 Mayıs 2026 · 5 Dakika
  2. ahmetakyapi.com: Bu Siteyi Nasıl Kurdum4 Ekim 2026 · 5 Dakika
  3. Açılış Zili: ABD Borsasını Doğru Takip Etmek3 Ekim 2026 · 7 Dakika