Bağlantı Yönetimi
Bağlantı kesilmelerini işleyin
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;
deferile temizleyiniz - Kapatma çerçeveleriyle zarifçe kapanınız; istemciler geri çekilme aralığıyla yeniden bağlanır
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
- WebSocket Temelleri
- gorilla/websocket Kullanımı
- İletileri Yayınlama
- Bağlantı Yönetimi