การดู : 358

06/05/2026 08:38น.

EP.76 การใช้ WebSocket ในการส่งข้อมูลขนาดใหญ่ (Handling Large Data Transfers)

EP.76 การใช้ WebSocket ในการส่งข้อมูลขนาดใหญ่ (Handling Large Data Transfers)

#Go

#Real-time Application

#Binary Data

#การบีบอัดข้อมูล

#การแบ่งข้อมูล

#WebSocket

ในตอนนี้ เราจะพูดถึงวิธีการส่ง ข้อมูลขนาดใหญ่ผ่าน WebSocket Server อย่างมีประสิทธิภาพ โดยใช้เทคนิคสำคัญ เช่น

  • การแบ่งข้อมูลเป็นชิ้นเล็ก ๆ (Chunking)
  • การบีบอัดข้อมูล (Compression)
  • การใช้ข้อมูลแบบไบนารี (Binary Data)

เทคนิคเหล่านี้ช่วยให้ระบบ WebSocket Chat หรือแอปพลิเคชันแบบ Real-Time สามารถส่งข้อมูลจำนวนมากได้โดยไม่ส่งผลกระทบต่อประสิทธิภาพของระบบ

 

🔸 ทำไมต้องใช้ WebSocket ส่งข้อมูลขนาดใหญ่?

 

1. ส่งข้อมูลแบบ Real-Time:
WebSocket รองรับการเชื่อมต่อแบบ persistent ทำให้สามารถส่งข้อมูลได้ทันทีโดยไม่ต้องเปิดการเชื่อมต่อใหม่ทุกครั้ง

2. จัดการข้อมูลขนาดใหญ่ได้ดี:
เมื่อใช้ร่วมกับ Chunking หรือ Compression ระบบจะสามารถจัดการข้อมูลใหญ่ได้อย่างลื่นไหล

3. ลดการใช้แบนด์วิดธ์:
การบีบอัดข้อมูลก่อนส่งช่วยลดปริมาณข้อมูลที่ต้องส่งผ่านเครือข่าย

4. รองรับการส่งข้อมูลสองทาง:
WebSocket รองรับการสื่อสารแบบ Full-Duplex ระหว่าง Server และ Client พร้อมกัน

 

🔸 วิธีการส่งข้อมูลขนาดใหญ่ใน WebSocket

 

✅ 1. การแบ่งข้อมูล (Chunking)

การแบ่งข้อมูลเป็นชิ้นเล็ก ๆ เพื่อส่งต่อแบบต่อเนื่อง ช่วยป้องกันการล่มของการเชื่อมต่อ และทำให้การส่งข้อมูลขนาดใหญ่เป็นไปอย่างปลอดภัย

 

🔧 ตัวอย่างโค้ด Go (Chunking):

func chunkData(data []byte, chunkSize int) [][]byte {
    var chunks [][]byte
    for i := 0; i < len(data); i += chunkSize {
        end := i + chunkSize
        if end > len(data) {
            end = len(data)
        }
        chunks = append(chunks, data[i:end])
    }
    return chunks
}

ระบบจะตัดข้อมูลออกเป็นหลาย ๆ ส่วนตามขนาด chunkSize และสามารถส่งออกไปทีละชิ้น

 

✅ 2. การบีบอัดข้อมูล (Compression)

การบีบอัดข้อมูลก่อนส่งจะช่วยลดขนาด Payload และทำให้การส่งข้อมูลเร็วขึ้น

 

🔧 โค้ด Go สำหรับเปิดใช้งาน Compression:

conn.EnableWriteCompression = true
conn.EnableReadCompression = true

เมื่อเปิดใช้งาน Compression บน WebSocket การส่งข้อความจะถูกบีบอัดโดยอัตโนมัติ (หากฝั่ง Client รองรับ)

 

✅ 3. การใช้ Binary Data

แทนที่จะส่งข้อมูลในรูปแบบข้อความหรือ JSON เราสามารถส่งข้อมูลแบบ Binary เช่นไฟล์รูปภาพ ไฟล์ PDF หรือข้อมูลเข้ารหัส ซึ่งช่วยประหยัดขนาดและประมวลผลได้เร็วกว่า

 

ใน Go สามารถส่ง Binary โดยใช้ websocket.BinaryMessage:

conn.WriteMessage(websocket.BinaryMessage, binaryData)

 

🔸 ตัวอย่างระบบ WebSocket ที่รองรับ Chunking

 

package main

import (
    "log"
    "net/http"
    "github.com/gorilla/websocket"
)

var clients = make(map[*websocket.Conn]bool)
var broadcast = make(chan []byte)

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(err)
        return
    }
    defer conn.Close()

    clients[conn] = true

    for {
        _, msg, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            delete(clients, conn)
            break
        }

        chunks := chunkData(msg, 1024)
        for _, chunk := range chunks {
            broadcast <- chunk
        }
    }
}

func chunkData(data []byte, chunkSize int) [][]byte {
    var chunks [][]byte
    for i := 0; i < len(data); i += chunkSize {
        end := i + chunkSize
        if end > len(data) {
            end = len(data)
        }
        chunks = append(chunks, data[i:end])
    }
    return chunks
}

func handleMessages() {
    for {
        msg := <-broadcast
        for client := range clients {
            err := client.WriteMessage(websocket.TextMessage, msg)
            if err != nil {
                log.Println(err)
                client.Close()
                delete(clients, client)
            }
        }
    }
}

func main() {
    http.HandleFunc("/", handleConnections)
    go handleMessages()
    log.Println("Server started on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

 

🔸 การทดสอบระบบ

 

✅ ทดสอบการแบ่งข้อมูล:
ส่งข้อมูลขนาดใหญ่และตรวจสอบว่าระบบสามารถแบ่งส่งได้ครบถ้วน

✅ ทดสอบการบีบอัด:
เปิดใช้ Compression และตรวจสอบว่าข้อมูลที่ส่งมีขนาดเล็กลง

✅ ทดสอบกับผู้ใช้หลายคน:
จำลองการส่งข้อมูลจากหลาย Client เพื่อดูว่าระบบยังคงทำงานได้ราบรื่น

 


 

💡 ท้าให้ลอง!

 

ลองสร้างระบบอัปโหลดไฟล์หรือส่งวิดีโอผ่าน WebSocket โดยใช้ Chunking ร่วมกับ Compression แล้ววัดประสิทธิภาพการส่งข้อมูลจริง!

 

🔜 EP ถัดไป:

 

EP.77 - การสร้างระบบแจ้งเตือนแบบทันที (Instant Notification System) ด้วย WebSocket
เรียนรู้การแจ้งเตือนผู้ใช้แบบ Real-Time เมื่อมีเหตุการณ์เกิดขึ้น — เช่น มีข้อความใหม่ การตอบกลับ หรือการเปลี่ยนแปลงสถานะ!

 

อ่านบทความ Series อื่นๆ

🔵 Facebook: Superdev School  (Superdev)

📸 Instagram: superdevschool

🎬 TikTok: superdevschool

🌐 Website: www.superdev.school