Go Academy · Ders

Bağlantı Yönetimi

Bağlantı kesilmelerini işleyin

4. ders / 413 adım

Bağlantı Yönetimi, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Go Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Go Academy kursu toplamda 4 dersten oluşur.

Bağlantılar Sonsuza Kadar Sürmez

İstemciler sekmeleri kapatır, Wi-Fi bağlantısını kaybeder veya çöker. Sağlam WebSocket sunucuları bağlantı kesilmelerini algılamalı, kaynakları temizlemeli ve goroutine'leri serbest bırakmalıdır. Aksi hâlde bellek ve soket sızıntısı yaşarsınız.

Kapatma El Sıkışması

Temiz bir kapanış, her iki yönde de bir kapatma çerçevesi gönderir. gorilla bunu, inceleyebileceğiniz bir kapatma koduyla birlikte ReadMessage işlevinden dönen bir hata olarak sunar.

if websocket.IsCloseError(err, websocket.CloseNormalClosure) {
    // graceful close
}

Ping/Pong Canlı Tutma

Yarı açık bir bağlantıyı (karşı taraf kapatmadan ortadan kaybolduğunda) algılamak için sunucu düzenli aralıklarla ping denetim çerçeveleri gönderir ve pong yanıtları bekler.

conn.SetPongHandler(func(string) error {
    conn.SetReadDeadline(time.Now().Add(60 * time.Second))
    return nil
})

Okuma Son Tarihleri

Ölü bir karşı tarafın sonsuza kadar beklemeye yol açmak yerine sonunda hata vermesi için bir okuma son tarihi belirleyiniz. Her pong geldiğinde bu tarihi yenileyiniz.

conn.SetReadDeadline(time.Now().Add(60 * time.Second))

Ping Zamanlayıcısı

Yazıcı goroutine'indeki bir zamanlayıcı düzenli ping'ler gönderir. Bir yazma işlemi başarısız olursa bağlantı ölmüş demektir ve çıkarsınız.

ticker := time.NewTicker(54 * time.Second)
defer ticker.Stop()
for range ticker.C {
    if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil {
        return
    }
}

Çıkışta Temizleme

Bir okuma veya yazma döngüsü sona erdiğinde istemcinin kaydını silip bağlantıyı kapatınız. defer, panik durumunda bile bunun güvenilir biçimde yapılmasını sağlar.

defer func() {
    hub.unregister <- client
    conn.Close()
}()

Bağlantı Başına İki Goroutine

Standart düzen, her bağlantı için bir readPump ve bir writePump çalıştırır. Biri bir hata algıladığında, diğerini durduran bir temizleme işlemini tetikler (çoğunlukla send kanalını kapatarak).

Yazma Son Tarihleri de Belirleyiniz

Sıkışmış bir yazma işleminin goroutine'i sonsuza kadar askıda bırakmaması için yazma son tarihleri belirleyiniz. Süresi dolan bir yazma işlemi hata döndürür ve bağlantıyı sonlandırırsınız.

conn.SetWriteDeadline(time.Now().Add(10 * time.Second))

Sunucuyu Zarifçe Kapatma

Sunucu kapanırken her istemciye bir kapatma çerçevesi gönderip kısa bir süre bekleyiniz. Bunu http.Server.Shutdown ve bir bağlam son tarihiyle birlikte kullanınız.

conn.WriteMessage(websocket.CloseMessage,
    websocket.FormatCloseMessage(websocket.CloseGoingAway, "bye"))

İstemcide Yeniden Bağlanma

Bağlantı kesilmeleri normaldir. İstemciler üstel geri çekilmeli yeniden bağlanma mantığı uygulamalıdır. Sunucu tarafının yalnızca her bağlantı ve bağlantı kesilmesini temiz biçimde yönetmesi gerekir.

Çalıştırılabilir: Zaman Aşımı Algılama Benzetmesi

WebSocket canlı tutma özelliği kitaplık gerektirir; bu standart kitaplık programı, bir zamanlayıcı ve kanal kullanarak son tarihe dayalı bir canlılık denetimini modeller.

package main

import (
    "fmt"
    "time"
)

func main() {
    pong := make(chan struct{})
    go func() {
        time.Sleep(20 * time.Millisecond) // simulate a slow/absent peer
        _ = pong                          // no pong sent -> dead connection
    }()
    select {
    case <-pong:
        fmt.Println("alive")
    case <-time.After(10 * time.Millisecond):
        fmt.Println("no pong: closing dead connection")
    }
}

Hızlı Kontrol

Bağlantı yönetimini anlayıp anlamadığınızı sınayınız.

Özet

Bağlantı yönetimini öğrendiniz:

  • Kapatma el sıkışmasını yönetin ve kapatma kodlarını inceleyiniz
  • Ölü karşı tarafları algılamak için ping/pong ile okuma ve yazma son tarihlerini kullanınız
  • Okuma ve yazma pompalarını çalıştırınız; defer ile temizleyiniz
  • Kapatma çerçeveleriyle zarifçe kapanınız; istemciler geri çekilme aralığıyla yeniden bağlanır
Başlamak ücretsiz

Yapay zeka eğitmeniyle Go öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
51
Dersler
203

Sıkça Sorulan Sorular

“Bağlantı Yönetimi” dersi ücretsiz mi?

Evet — “Bağlantı Yönetimi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Go Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Go Academy kursu toplamda 4 dersten oluşur.

“Bağlantı Yönetimi” dersinde ne öğreneceğim?

Bağlantı kesilmelerini işleyin Go Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Go Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Go Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Bağlantı Yönetimi” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Go Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Go Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. WebSocket Temelleri
  2. gorilla/websocket Kullanımı
  3. İletileri Yayınlama
  4. Bağlantı Yönetimi
← Go Academy Sayfasına Dön