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