ตัวอย่างจาก WebSocket RFC:
หากต้องการ เริ่ม WebSocket Closing Handshake ด้วยรหัสสถานะ (ส่วนที่ 7.4) /code/ และเหตุผลการปิดเพิ่มเติม (ส่วนที่ 7.1.6) /reason/ จุดสิ้นสุดจะต้องส่งเฟรมควบคุมการปิด ตามที่อธิบายไว้ ในส่วนที่ 5.5.1 ซึ่งมีรหัสสถานะตั้งเป็น /code/ และมีเหตุผลปิดตั้งเป็น /reason/ เมื่อจุดสิ้นสุดมีทั้งส่งและรับกรอบการควบคุมปิด จุดสิ้นสุดนั้นควร ปิดการเชื่อมต่อ WebSocket ตามที่กำหนดไว้ในส่วน 7.1.1
ฉันกำลังพยายามปิด Handshake โดยใช้แพ็คเกจ Gorilla WebSocket ด้วยรหัสต่อไปนี้:
เซิร์ฟเวอร์:
// 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
}
ลูกค้า:
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 {}
เซิร์ฟเวอร์กำลังอ่านเฟรมปิดตามที่คาดไว้ซึ่งจะแสดงผลลัพธ์ต่อไปนี้:
websocket: ปิด 1,000 (ปกติ): อุ๊ย
อย่างไรก็ตาม ลูกค้าก็เหมือนกับการหยุดอ่านเมื่อส่งข้อความปิดไปแล้ว ReadMessage
ยังคงส่งคืนข้อผิดพลาด 1005 ฉันทำอะไรผิด