0Pricing
Go Academy · บทเรียน

การใช้ gorilla/websocket

ยกระดับและจัดการการเชื่อมต่อ

การใช้ gorilla/websocket เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

ไลบรารี gorilla/websocket

gorilla/websocket เป็นไลบรารี WebSocket สำหรับ Go ที่มีการใช้งานแพร่หลายที่สุด ไลบรารีนี้จัดการการจับมือเพื่ออัปเกรดและมอบออบเจ็กต์การเชื่อมต่อให้คุณอ่านและเขียนเฟรมได้ ติดตั้งด้วย go get github.com/gorilla/websocket

import "github.com/gorilla/websocket"

ตัวอัปเกรด

Upgrader แปลงคำขอ HTTP ให้เป็นการเชื่อมต่อ WebSocket คุณสามารถกำหนดขนาดบัฟเฟอร์และการตรวจสอบต้นทางได้

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

CheckOrigin และความปลอดภัย

โดยค่าเริ่มต้น ตัวอัปเกรดจะปฏิเสธคำขอจากต้นทางอื่น ระหว่างการพัฒนาคุณอาจผ่อนปรนการตรวจสอบได้ แต่ในสภาพแวดล้อมจริงต้องตรวจสอบส่วนหัว Origin เพื่อป้องกันการยึดการเชื่อมต่อ WebSocket จากเว็บไซต์อื่น

upgrader.CheckOrigin = func(r *http.Request) bool {
    return r.Header.Get("Origin") == "https://myapp.com"
}

การอัปเกรดในตัวจัดการ

ภายใน http.HandlerFunc ให้เรียกใช้ Upgrade เมื่อสำเร็จ คุณจะได้รับ *websocket.Conn

func wsHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        return
    }
    defer conn.Close()
    // read/write loop here
}

การอ่านข้อความ

ReadMessage จะหยุดรอจนกว่าเฟรมจะมาถึง จากนั้นส่งคืนประเภทข้อความและไบต์ข้อมูล

mt, data, err := conn.ReadMessage()
if err != nil {
    return // client closed or error
}
fmt.Printf("got %d bytes\n", len(data))
_ = mt

การเขียนข้อความ

WriteMessage ส่งเฟรมตามประเภทที่กำหนด:

err := conn.WriteMessage(websocket.TextMessage, []byte("hello"))
if err != nil {
    return
}

ลูปสะท้อนข้อความ

ตัวอย่างคลาสสิกคือการอ่านข้อความแล้วเขียนข้อความนั้นกลับไป ลูปจะจบลงเมื่อ Read ส่งคืนข้อผิดพลาด ซึ่งหมายความว่าไคลเอ็นต์ยกเลิกการเชื่อมต่อแล้ว

for {
    mt, msg, err := conn.ReadMessage()
    if err != nil {
        break
    }
    conn.WriteMessage(mt, msg)
}

ตัวช่วย JSON

gorilla มี ReadJSON และ WriteJSON สำหรับแปลงค่า Go เป็นข้อมูลในรูปแบบ JSON และส่งผ่านซ็อกเก็ตโดยตรง จึงเหมาะสำหรับข้อความที่มีโครงสร้าง ฟิลด์ของโครงสร้าง Msg จะมีแท็ก json:"text" ในซอร์สจริง

type Msg struct {
    Text string // tag: json text
}
var m Msg
conn.ReadJSON(&m)
conn.WriteJSON(Msg{Text: "ack"})

กฎตัวอ่านหนึ่งตัวและตัวเขียนหนึ่งตัว

สำคัญ: การเชื่อมต่อหนึ่งรายการรองรับตัวอ่านที่ทำงานพร้อมกันได้เพียงหนึ่งตัวและตัวเขียนที่ทำงานพร้อมกันได้เพียงหนึ่งตัว หากมีกอรูทีนหลายตัวเขียนข้อมูล ให้ป้องกันด้วยมิวเท็กซ์หรือรวมการเขียนทั้งหมดไว้ที่กอรูทีนเดียว ซึ่งจะกล่าวถึงในบทเรียนเรื่องการกระจายข้อความ

การลงทะเบียนเส้นทาง

เชื่อมต่อตัวจัดการเข้ากับเส้นทาง HTTP เช่นเดียวกับเส้นทางอื่น ไคลเอ็นต์จะเชื่อมต่อไปที่ ws://host/ws

http.HandleFunc("/ws", wsHandler)
http.ListenAndServe(":8080", nil)

ตัวอย่างที่รันได้: การส่ง JSON ไปกลับ

โค้ด WebSocket ต้องใช้ไลบรารีภายนอก ส่วนโค้ดตัวอย่างที่ใช้ไลบรารีมาตรฐานนี้จำลองการทำงานของ ReadJSON/WriteJSON โดยแปลงข้อความขาเข้าเป็นแมป แล้วแปลงคำตอบกลับเป็น JSON

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    in := []byte("{\"text\":\"ping\"}")
    var m map[string]string
    json.Unmarshal(in, &m)
    reply, _ := json.Marshal(map[string]string{"text": m["text"] + "-ack"})
    fmt.Println(string(reply))
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจการใช้งาน gorilla/websocket

สรุปทบทวน

คุณได้เรียนรู้การใช้ gorilla/websocket ดังนี้:

  • Upgrader ทำการจับมือ ส่วน CheckOrigin ใช้ตรวจสอบต้นทาง
  • Upgrade ส่งคืน *websocket.Conn
  • ใช้ ReadMessage/WriteMessage หรือตัวช่วย JSON
  • การเชื่อมต่อแต่ละรายการมีตัวอ่านและตัวเขียนได้อย่างละหนึ่งตัวในแต่ละครั้ง

คำถามที่พบบ่อย

บทเรียน “การใช้ gorilla/websocket” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การใช้ gorilla/websocket” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การใช้ gorilla/websocket”

ยกระดับและจัดการการเชื่อมต่อ คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การใช้ gorilla/websocket” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน WebSocket
  2. การใช้ gorilla/websocket
  3. การกระจายข้อความ
  4. การจัดการการเชื่อมต่อ
← กลับไปที่ Go Academy