พื้นฐาน WebSocket
การสื่อสารสองทิศทางแบบเรียลไทม์
พื้นฐาน WebSocket เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
การสื่อสารแบบเรียลไทม์สองทาง
HTTP ใช้รูปแบบคำขอ-การตอบกลับ: ไคลเอนต์ถาม เซิร์ฟเวอร์ตอบ แล้วการเชื่อมต่อจะสิ้นสุดลงในเชิงตรรกะ สำหรับแชต แดชบอร์ดสด และเกม คุณต้องมีช่องทางแบบถาวรที่สื่อสารได้สองทิศทาง ซึ่งก็คือสิ่งที่ WebSockets มอบให้
การจับมือเพื่ออัปเกรด
การเชื่อมต่อ WebSocket เริ่มต้นเป็นคำขอ HTTP ปกติที่มีส่วนหัวพิเศษ:
Upgrade: websocketConnection: Upgrade
เซิร์ฟเวอร์ตอบกลับด้วย 101 Switching Protocols แล้วนำซ็อกเก็ต TCP กลับมาใช้สำหรับเฟรมแบบสองทางเต็มรูปแบบ
เหตุใดจึงไม่ใช้การสำรวจเป็นระยะ
ก่อนมี WebSockets แอปใช้การสำรวจเป็นระยะ (ส่งคำขอซ้ำ ๆ) หรือการสำรวจแบบรอนาน ทั้งสองวิธีสิ้นเปลืองแบนด์วิดท์และเพิ่มความหน่วง WebSockets จะคงการเชื่อมต่อหนึ่งรายการไว้ จึงทำให้ทั้งสองฝ่ายส่งข้อมูลได้ทันที
เฟรมแทนคำขอ
หลังจากอัปเกรดแล้ว ข้อมูลจะเดินทางเป็นเฟรมน้ำหนักเบาแทนข้อความ HTTP เฟรมอาจเป็นข้อความหรือข้อมูลไบนารี และยังมีเฟรมควบคุมสำหรับ ping/pong และการปิดการเชื่อมต่อ
การสื่อสารสองทางเต็มรูปแบบ
ต่างจาก HTTP ตรงที่เพียร์ทั้งสองฝ่ายสามารถส่งข้อมูลได้ทุกเมื่อโดยไม่ต้องรอการตอบกลับ เซิร์ฟเวอร์สามารถส่งการแจ้งเตือนได้ทันทีที่มีการเปลี่ยนแปลง และไคลเอนต์สามารถส่งอินพุตไปพร้อมกันได้
ws เทียบกับ wss
เช่นเดียวกับ http/https WebSockets มีโครงร่างอยู่สองแบบ:
ws://แบบข้อความไม่เข้ารหัสwss://ผ่าน TLS (ใช้แบบนี้ในการใช้งานจริง)
การรองรับจากไลบรารีมาตรฐาน
ไลบรารีมาตรฐานของ Go ไม่มีการใช้งาน WebSocket ใน net/http เพียงอย่างเดียว ชุมชนนักพัฒนาจึงใช้ github.com/gorilla/websocket หรือ nhooyr.io/websocket เราจะกล่าวถึงไลบรารี gorilla ในบทเรียนถัดไป
import "github.com/gorilla/websocket"แบบจำลองทางความคิด
ลองนึกภาพ WebSocket ว่าเป็นการคุยโทรศัพท์:
- การกดโทรออก = การจับมือเพื่ออัปเกรด HTTP
- สายที่เปิดอยู่ = การเชื่อมต่อแบบคงอยู่
- การพูดคุยโต้ตอบกัน = เฟรมแบบสื่อสารสองทิศทางพร้อมกัน
- การวางสาย = เฟรมปิด
ประเภทของข้อความ
เฟรมข้อมูลสองประเภทที่สำคัญที่สุดมีดังนี้:
- ข้อความ เฟรมประเภทนี้บรรจุ UTF-8 ซึ่งมักเป็น JSON
- ไบนารี เฟรมประเภทนี้บรรจุไบต์ดิบ เช่น โพรโทคอลบัฟเฟอร์และรูปภาพ
เฟรมควบคุม เช่น ping, pong และ close ใช้จัดการตัวการเชื่อมต่อเอง
จุดเด่นของ WebSockets
เหมาะอย่างยิ่งสำหรับ:
- แชตและสถานะออนไลน์
- การซื้อขายหรือคะแนนกีฬาแบบเรียลไทม์
- การแก้ไขเอกสารร่วมกัน
- สถานะเกมแบบผู้เล่นหลายคน
หากต้องการส่งข้อมูลทางเดียวจากเซิร์ฟเวอร์ไปยังไคลเอ็นต์เท่านั้น เหตุการณ์ที่เซิร์ฟเวอร์ส่งถึงไคลเอ็นต์อาจเรียบง่ายกว่า
ตัวอย่างที่รันได้: ทำความเข้าใจเฟรม
โค้ด WebSocket ต้องใช้ไลบรารีภายนอก ดังนั้นเราจะใช้การเปรียบเทียบโดยใช้ไลบรารีมาตรฐานแทน: ฟังก์ชันที่จัดประเภทข้อความว่าเป็นข้อความหรือไบนารี เพื่อแสดงแนวคิดเรื่องประเภทเฟรม
package main
import (
"fmt"
"unicode/utf8"
)
func frameType(data []byte) string {
if utf8.Valid(data) {
return "text"
}
return "binary"
}
func main() {
fmt.Println(frameType([]byte("hello")))
fmt.Println(frameType([]byte{0xff, 0x00, 0x01}))
}ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจพื้นฐานของ WebSocket
สรุปทบทวน
คุณได้เรียนรู้พื้นฐานของ WebSocket ดังนี้:
- WebSocket ให้การสื่อสารแบบคงอยู่และสื่อสารสองทิศทางพร้อมกัน
- เริ่มต้นด้วยการจับมือเพื่ออัปเกรด HTTP ซึ่งให้การตอบกลับ 101
- ข้อมูลไหลผ่านเฟรมข้อความหรือไบนารี ส่วนเฟรมควบคุมใช้จัดการการเชื่อมต่อ
- ใช้
wss://ในสภาพแวดล้อมจริง ส่วน Go อาศัยไลบรารีอย่าง gorilla/websocket
คำถามที่พบบ่อย
บทเรียน “พื้นฐาน WebSocket” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “พื้นฐาน WebSocket” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐาน WebSocket”
การสื่อสารสองทิศทางแบบเรียลไทม์ คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “พื้นฐาน WebSocket” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐาน WebSocket
- การใช้ gorilla/websocket
- การกระจายข้อความ
- การจัดการการเชื่อมต่อ