WebSockets: Go ile Gerçek Zamanlı Sohbet Uygulaması Yapımı

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Katılım
7 Ocak 2026
Mesajlar
290
Tepkime puanı
2
Puanları
18

HTTP'nin Ötesi​

HTTP protokolü "İstek-Cevap" (Request-Response) mantığıyla çalışır. İstemci sormadan sunucu cevap veremez. Bu, sohbet uygulamaları veya canlı borsa takibi için çok yavaştır.WebSocket, tarayıcı ile sunucu arasında sürekli açık kalan, iki yönlü (Full-duplex) bir tünel açar. Sunucu, istediği an istemciye veri gönderebilir.

Go'da WebSocket:​

Go'nun standart kütüphanesinde WebSocket desteği sınırlıdır (ve golang.org/x/net altındadır). Endüstri standardı github.com/gorilla/websocket paketidir.

1. Handshake (Tokalaşma) ve Upgrade​

WebSocket bağlantısı aslında standart bir HTTP isteği ile başlar. Sunucu bu isteği yakalar ve "Hadi artık HTTP'yi bırakıp WebSocket'e geçelim" der (Upgrade).

Kod:
package main

import ("fmt""net/http""github.com/gorilla/websocket")

// Upgrader: HTTP bağlantısını WebSocket'e yükseltirvar upgrader = websocket.Upgrader{ReadBufferSize:  1024,WriteBufferSize: 1024,// CORS (Farklı domainden gelen isteklere izin ver)CheckOrigin: func(r *http.Request) bool { return true },}

func socketHandler(w http.ResponseWriter, r *http.Request) {// 1. Upgrade İşlemiconn, err := upgrader.Upgrade(w, r, nil)if err != nil {fmt.Println("Upgrade Hatası:", err)return}defer conn.Close()

fmt.Println("Yeni bir istemci bağlandı!")<br><br>// 2. Sonsuz Döngü (Bağlantı kopana kadar dinle)<br>for {<br>    // Mesaj Oku<br>    messageType, p, err := conn.ReadMessage()<br>    if err != nil {<br>        fmt.Println("Okuma Hatası:", err)<br>        break // Döngüden çık, bağlantıyı kapat<br>    }<br><br>    fmt.Printf("Gelen Mesaj: %s\n", p)<br><br>    // Echo (Aynısını geri gönder)<br>    if err := conn.WriteMessage(messageType, p); err != nil {<br>        fmt.Println("Yazma Hatası:", err)<br>        break<br>    }<br>}<br>
}

func main() {http.HandleFunc("/ws", socketHandler)http.ListenAndServe(":8080", nil)}

Hub Pattern (Oda Mantığı)​

Yukarıdaki kod sadece tek kişiyle konuşur (Echo). Gerçek bir sohbet uygulamasında (WhatsApp grubu gibi), gelen mesajı tüm bağlı kullanıcılara (Broadcast) göndermeniz gerekir.Bunun için Go'da genellikle bir Hub struct'ı, bağlı kullanıcıların listesini (map[*Client]bool) tutar ve bir kanaldan (chan []byte) gelen mesajı döngüyle herkese dağıtır.

Sonuç​

Go'nun Goroutine yapısı, WebSocket için biçilmiş kaftandır. Her bağlantı için bir Goroutine açarak (ki çok ucuzdur), tek bir sunucuda yüz binlerce canlı sohbet bağlantısını (C10k problemi) rahatlıkla yönetebilirsiniz.
 
Geri
Üst