Cuplikan dari WebSocket RFC:
Untuk Memulai Jabat Tangan Penutupan WebSocket dengan kode status (Bagian 7.4) /code/ dan alasan penutupan opsional (Bagian 7.1.6) /alasan/, titik akhir HARUS mengirimkan bingkai kontrol Tutup, seperti yang dijelaskan di Bagian 5.5.1, yang kode statusnya disetel ke /code/ dan alasan dekatnya disetel ke /reason/. Setelah titik akhir mengirim dan menerima bingkai kontrol Tutup, titik akhir tersebut HARUS Menutup Koneksi WebSocket seperti yang ditentukan dalam Bagian 7.1.1.
Saya mencoba melakukan Close Handshake menggunakan paket Gorilla WebSocket dengan kode berikut:
pelayan:
// Create upgrader function
conn, err := upgrader.Upgrade(w, r, nil)
// If there is an error stop everything.
if err != nil {
fmt.Println(err)
return
}
for {
// Read Messages
_, _, err := conn.ReadMessage()
// Client is programmed to send a close frame immediately...
// When reading close frame resend close frame with same
// reason and code
conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(1000, "woops"))
fmt.Println(err)
break
}
Klien:
d := &websocket.Dialer{}
conn, _, err := d.Dial("ws://localhost:8080", nil)
if err != nil {
fmt.Println(err)
return
}
go func() {
for {
// Read Messages
_, _, err := conn.ReadMessage()
if c, k := err.(*websocket.CloseError); k {
if(c.Code == 1000) {
// Never entering since c.Code == 1005
fmt.Println(err)
break
}
}
}
}()
conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(1000, "woops"))
for {}
Server membaca Close Frame seperti yang diharapkan dan menghasilkan keluaran berikut:
websocket: tutup 1000 (normal): ups
Namun klien seperti berhenti membaca setelah mengirimkan pesan dekat. ReadMessage
terus mengembalikan kesalahan 1005. Apa yang saya lakukan salah?