12/04/2026 18:16น.

Ep.24 Go กับ Error Handling & Logging บน WebSocket - เพิ่มความมั่นคงให้ระบบของคุณ!
#Go
#Golang
#ภาษา Go
#WebSocket
#Error Handling
#Logging
#ความมั่นคงของระบบ
#การจัดการข้อผิดพลาด
#การบันทึกข้อมูล
#การศึกษาการเขียนโปรแกรม
#การพัฒนาโปรแกรม
#การเขียนโปรแกรม
#การเขียนโปรแกรม Go
#การเขียนโปรแกรมสำหรับมือใหม่
#ฝึกเขียนโปรแกรม
#ภาษาโปรแกรม
#โปรแกรม
#โปรแกรมเมอร์
#Superdev School
Go กับ Error Handling & Logging บน WebSocket - เพิ่มความมั่นคงให้ระบบของคุณ!
ทำไมต้องจัดการ Error และ Logging บน WebSocket?
WebSocket เป็นโปรโตคอลที่ทำงานแบบเรียลไทม์ หากเกิดข้อผิดพลาด (Error) หรือการตัดการเชื่อมต่อ (Disconnection) อาจส่งผลต่อประสบการณ์ของผู้ใช้ การมีระบบจัดการ Error และ Logging จะช่วย :
- ตรวจสอบเหตุการณ์ผิดปกติ เช่น การเชื่อมต่อขาดหรือข้อความไม่ถูกต้อง
- ดีบักปัญหาได้รวดเร็ว โดยดูข้อมูลใน Log
- เพิ่มความมั่นคงของระบบ ด้วยการจัดการ Error แบบอัตโนมัติ
วิธีจัดการ Error บน WebSocket
1. ตรวจสอบข้อผิดพลาดระหว่างการเชื่อมต่อ
ทุกครั้งที่มีการสร้างการเชื่อมต่อ WebSocket เราควรตรวจสอบ Error เพื่อให้แน่ใจว่าการเชื่อมต่อสำเร็จ
ในตัวอย่างนี้ :
หากเกิดข้อผิดพลาด จะส่งข้อความ HTTP Error กลับไปยังผู้ใช้ และบันทึก Error ลงใน Log
ตัวอย่าง :
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("Failed to upgrade connection:", err)
http.Error(w, "Could not open WebSocket connection", http.StatusBadRequest)
return
}
2. จัดการ Error ขณะรับและส่งข้อความ
Error อาจเกิดขึ้นได้เมื่อไคลเอนต์ปิดการเชื่อมต่อ หรือส่งข้อความในรูปแบบที่ไม่ถูกต้อง
ในตัวอย่างนี้ :
ใช้ break เพื่อตัดการเชื่อมต่อเมื่อเกิดข้อผิดพลาด
for {
_, msg, err := conn.ReadMessage()
if err != nil {
log.Println("Error reading message:", err)
break // ปิดการเชื่อมต่อเมื่อเกิด Error
}
if err := conn.WriteMessage(websocket.TextMessage, msg); err != nil {
log.Println("Error writing message:", err)
break
}
}
3. ตรวจจับการตัดการเชื่อมต่อ
เมื่อไคลเอนต์ปิดการเชื่อมต่อ เราสามารถตรวจจับ Error และดำเนินการลบการเชื่อมต่อออกจากระบบได้
ตัวอย่าง :
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
log.Printf("Unexpected close error: %v", err)
}
การบันทึก Log เพื่อการตรวจสอบ
1. บันทึกเหตุการณ์สำคัญ
เราสามารถใช้ log.Println เพื่อบันทึกเหตุการณ์ เช่น การเชื่อมต่อใหม่ การตัดการเชื่อมต่อ และข้อความที่ส่งระหว่างเซิร์ฟเวอร์และไคลเอนต์
ตัวอย่าง :
log.Println("New client connected")
defer log.Println("Client disconnected")
2. บันทึก Log ลงไฟล์
แทนที่จะพิมพ์ Log ลงหน้าจอ เราสามารถบันทึก Log ลงไฟล์เพื่อการตรวจสอบย้อนหลัง
ตัวอย่าง :
file, err := os.OpenFile("websocket.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
log.SetOutput(file) // บันทึก Log ลงไฟล์
log.Println("WebSocket server started")
ตัวอย่างการจัดการ Error และ Logging บน WebSocket
ในตัวอย่างนี้ :
บันทึก Log ทุกเหตุการณ์สำคัญลงไฟล์ websocket.log
ตรวจสอบและจัดการ Error ทั้งในขั้นตอนการเชื่อมต่อและระหว่างการส่งข้อความ
package main
import (
"log"
"net/http"
"os"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true
},
}
func handleConnections(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("Error upgrading connection:", err)
return
}
defer conn.Close()
log.Println("New client connected")
for {
_, msg, err := conn.ReadMessage()
if err != nil {
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
log.Printf("Unexpected close error: %v", err)
}
log.Println("Connection closed")
break
}
log.Printf("Received message: %s", msg)
if err := conn.WriteMessage(websocket.TextMessage, msg); err != nil {
log.Println("Error writing message:", err)
break
}
}
}
func main() {
file, err := os.OpenFile("websocket.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
log.SetOutput(file)
http.HandleFunc("/ws", handleConnections)
log.Println("WebSocket server started at :8080/ws")
http.ListenAndServe(":8080", nil)
}
สรุปง่ายๆ
- ใช้ log.Println เพื่อบันทึกเหตุการณ์สำคัญ
- ตรวจสอบและจัดการ Error ในทุกขั้นตอนของ WebSocket
- บันทึก Log ลงไฟล์เพื่อการตรวจสอบย้อนหลัง
- ใช้ websocket.IsUnexpectedCloseError เพื่อตรวจจับการตัดการเชื่อมต่อที่ไม่ปกติ