12/04/2026 18:17น.

EP.93 การเพิ่มฟีเจอร์การสื่อสารแบบ Voice หรือ Video ใน WebSocket Chat
#WebSocket
#WebRTC
#Voice Chat
#Video Call
#Real-time Communication
#Go Language
ในยุคของการสื่อสารแบบเรียลไทม์ ฟีเจอร์ Voice และ Video Chat กลายเป็นสิ่งจำเป็นสำหรับแอปพลิเคชันยุคใหม่ หากคุณพัฒนา WebSocket Chat ด้วยภาษา Go แล้วต้องการอัปเกรดให้ผู้ใช้งานสามารถสื่อสารแบบเห็นหน้าหรือพูดคุยแบบสดได้ บทความนี้จะพาไปเรียนรู้การรวม WebRTC กับ WebSocket เพื่อให้ระบบของคุณสามารถรองรับฟีเจอร์เหล่านี้ได้อย่างมีประสิทธิภาพ
🎯 ทำไมต้องใช้ WebRTC ร่วมกับ WebSocket
- WebRTC (Web Real-Time Communication) คือเทคโนโลยีสำหรับส่งเสียงและวิดีโอแบบ peer-to-peer โดยไม่ต้องผ่านเซิร์ฟเวอร์ media
- WebSocket ใช้เป็นช่องทาง signaling เพื่อแลกเปลี่ยนข้อมูลสำคัญ (เช่น SDP และ ICE candidate) สำหรับจับคู่การเชื่อมต่อ
ข้อดีของการรวมกัน:
✅ ส่งเสียงและวิดีโอแบบ real-time โดยตรงระหว่าง client
✅ ลด latency และประหยัด bandwidth
✅ รองรับการสื่อสารหลายคนในห้องเดียวได้ง่ายขึ้น
🧩 โครงสร้างระบบ (Architecture Overview)
- ผู้ใช้เชื่อมต่อ WebSocket เพื่อทำ signaling
- ผู้ใช้แลกเปลี่ยน SDP และ ICE ผ่าน WebSocket
- WebRTC สร้าง media stream แบบ peer-to-peer
- WebSocket Server คอยดูแลห้อง, การเข้าร่วม, และ fallback กรณีการเชื่อมต่อไม่สำเร็จ
🔄 ลำดับการสื่อสาร (Signaling Flow):
ผู้ใช้ A ---- WebSocket ----> Server ---- WebSocket ----> ผู้ใช้ B
(SDP Offer / ICE Candidate) (SDP Answer / ICE Candidate)
🛠️ ตัวอย่างโค้ด Go – WebSocket Signaling Handler
func signalingHandler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("Upgrade error:", err)
return
}
defer conn.Close()
for {
_, msg, err := conn.ReadMessage()
if err != nil {
log.Println("Read error:", err)
break
}
var signal SignalMessage
if err := json.Unmarshal(msg, &signal); err == nil {
forwardToUser(signal.TargetID, msg)
}
}
}
โครงสร้าง SignalMessage:
type SignalMessage struct {
Type string `json:"type"` // offer, answer, candidate
SenderID string `json:"sender_id"`
TargetID string `json:"target_id"`
Payload string `json:"payload"` // ข้อมูล SDP หรือ ICE
}
🎥 ตัวอย่างฝั่ง Client – การส่งสัญญาณด้วย WebSocket
const peer = new RTCPeerConnection(config);
navigator.mediaDevices.getUserMedia({ video: true, audio: true })
.then(stream => {
localVideo.srcObject = stream;
stream.getTracks().forEach(track => peer.addTrack(track, stream));
});
peer.createOffer().then(offer => {
peer.setLocalDescription(offer);
socket.send(JSON.stringify({
type: "offer",
target_id: "user_b",
sender_id: "user_a",
payload: JSON.stringify(offer)
}));
});
📶 เทคนิคจัดการ Bandwidth ให้มีประสิทธิภาพ
- 🎧 ใช้ Opus codec สำหรับเสียง และ VP8/VP9 หรือ H.264 สำหรับวิดีโอ
- 🔄 ปรับ bitrate และความละเอียด (resolution) ตามความเร็วเน็ตเวิร์ก
- 🔀 ใช้ simulcast และ adaptive bitrate เมื่อมีผู้ใช้หลายคนในห้องเดียว
- 🗜️ ใช้ compression และส่งเฉพาะข้อมูลที่เปลี่ยนแปลงเพื่อประหยัด bandwidth
✅ แนวทางปฏิบัติที่แนะนำ (Best Practices)
🔒 ใช้ HTTPS/WSS ทุกครั้งเพื่อความปลอดภัยของข้อมูล
🌐 เตรียม TURN server สำหรับ fallback กรณี NAT หรือ firewall บล็อกการเชื่อมต่อ
🎛️ มี UI สำหรับ mute/unmute, เปิด/ปิดกล้อง และจัดการ event แบบเรียลไทม์
🧪 ทดสอบกับหลายเบราว์เซอร์ อุปกรณ์ และสภาพเครือข่าย
📦 วางโครงระบบให้รองรับ SFU หรือ mesh สำหรับห้อง video ขนาดใหญ่
🚀 สรุปส่งท้าย
การรวม WebRTC เข้ากับ WebSocket จะช่วยให้ระบบแชทของคุณมีฟีเจอร์ Voice & Video Call แบบ real-time ซึ่งสามารถรองรับทั้งการสนทนารายบุคคลและแบบกลุ่มได้อย่างมีประสิทธิภาพ พร้อมขยายระบบต่อไปในอนาคตได้ง่าย
🔥 ชาเลนจ์ก่อนขึ้น EP.94
🎯 ลองสร้างระบบ Video Call ง่าย ๆ ด้วย WebSocket + WebRTC:
- สร้าง signaling server ด้วย Go
- ให้ผู้ใช้สร้างห้องและแชร์ลิงก์ให้ผู้อื่นเข้าร่วม
- แลกเปลี่ยน SDP/ICE ผ่าน WebSocket
- ใช้ STUN/TURN สำหรับ NAT traversal
- เพิ่มปุ่มเปิด-ปิดไมค์/กล้อง
จากนั้นลองวิเคราะห์จุดที่สามารถปรับปรุง และนำไปแชร์กับทีมของคุณเพื่อเรียนรู้ร่วมกัน!
🔜 Next EP.94:
การสร้าง WebSocket Server ที่รองรับการทำงานร่วมกับ Microservices
เรียนรู้การออกแบบระบบให้สามารถทำงานร่วมกับบริการย่อยได้อย่างมีประสิทธิภาพ ด้วยแนวคิด Microservices, Message Broker, และ Horizontal Scaling
อ่านบทความ Series อื่นๆ
🔵 Facebook: https://www.facebook.com/superdev.academy.th
🔴 YouTube : Superdev Academy
📸 Instagram: Superdev Academy
🎬 TikTok: https://www.tiktok.com/@superdevacademy?lang=th-TH
🌐 Website: https://www.superdevacademy.com/