Pengelolaan Koneksi
Tangani pemutusan koneksi
Pengelolaan Koneksi adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.
Koneksi Tidak Bertahan Selamanya
Klien menutup tab, kehilangan Wi-Fi, atau mengalami kerusakan. Server WebSocket yang tangguh harus mendeteksi pemutusan, membersihkan sumber daya, dan membebaskan goroutine. Jika tidak, memori dan soket akan bocor.
Jabat Tangan Penutupan
Penutupan yang bersih mengirimkan bingkai penutupan ke kedua arah. gorilla menampilkannya sebagai kesalahan dari ReadMessage dengan kode penutupan yang dapat Anda periksa.
if websocket.IsCloseError(err, websocket.CloseNormalClosure) {
// graceful close
}Keepalive Ping/Pong
Untuk mendeteksi koneksi setengah terbuka (peer menghilang tanpa menutup koneksi), server secara berkala mengirimkan bingkai kontrol ping dan mengharapkan balasan pong.
conn.SetPongHandler(func(string) error {
conn.SetReadDeadline(time.Now().Add(60 * time.Second))
return nil
})Tenggat Waktu Pembacaan
Tetapkan tenggat waktu pembacaan agar peer yang mati pada akhirnya menghasilkan kesalahan, bukan terblokir selamanya. Perbarui tenggat tersebut setiap kali pong tiba.
conn.SetReadDeadline(time.Now().Add(60 * time.Second))Ticker Ping
Sebuah ticker dalam goroutine penulis mengirimkan ping secara berkala. Jika penulisan gagal, koneksi sudah mati dan Anda keluar.
ticker := time.NewTicker(54 * time.Second)
defer ticker.Stop()
for range ticker.C {
if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil {
return
}
}Pembersihan Saat Keluar
Ketika perulangan pembacaan atau penulisan berakhir, batalkan pendaftaran klien dan tutup koneksi. defer membuat proses ini andal bahkan saat terjadi panic.
defer func() {
hub.unregister <- client
conn.Close()
}()Dua Goroutine per Koneksi
Pola standar menjalankan readPump dan writePump untuk setiap koneksi. Ketika salah satunya mendeteksi kesalahan, goroutine tersebut memicu pembersihan yang menghentikan goroutine lainnya (sering kali dengan menutup kanal send).
Tenggat Waktu Penulisan Juga
Tetapkan tenggat waktu penulisan agar penulisan yang macet tidak membuat goroutine menunggu selamanya. Penulisan yang melewati batas waktu mengembalikan kesalahan, lalu Anda membongkar koneksi tersebut.
conn.SetWriteDeadline(time.Now().Add(10 * time.Second))Penutupan Server yang Anggun
Saat server dimatikan, kirimkan bingkai penutupan kepada setiap klien dan tunggu sebentar. Gabungkan dengan http.Server.Shutdown dan tenggat waktu context.
conn.WriteMessage(websocket.CloseMessage,
websocket.FormatCloseMessage(websocket.CloseGoingAway, "bye"))Menyambung Kembali pada Klien
Pemutusan koneksi adalah hal yang normal. Klien sebaiknya menerapkan logika penyambungan kembali dengan backoff eksponensial. Sisi server hanya perlu menangani setiap koneksi dan pemutusan dengan bersih.
Dapat Dijalankan: Analogi Deteksi Tenggat Waktu
Keepalive WebSocket memerlukan pustaka; program pustaka standar ini memodelkan pemeriksaan kelangsungan hidup berbasis tenggat waktu dengan timer dan kanal.
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")
}
}Pemeriksaan Singkat
Uji pemahaman Anda tentang pengelolaan koneksi.
Rangkuman
Anda telah mempelajari pengelolaan koneksi:
- Tangani jabat tangan penutupan dan periksa kode penutupan
- Gunakan ping/pong serta tenggat waktu pembacaan dan penulisan untuk mendeteksi peer yang mati
- Jalankan readPump dan writePump; lakukan pembersihan dengan
defer - Lakukan penutupan secara anggun dengan bingkai penutupan; klien menyambung kembali dengan backoff
Belajar Go dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pengelolaan Koneksi” gratis?
Ya — teks lengkap “Pengelolaan Koneksi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pengelolaan Koneksi”?
Tangani pemutusan koneksi Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Go Academy?
Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Pengelolaan Koneksi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Dasar-Dasar WebSocket
- Menggunakan gorilla/websocket
- Menyiarkan Pesan
- Pengelolaan Koneksi