การใช้ Gorilla Websockets

ในบทความนี้ เราจะมาดูกันว่าเราจะใช้ แพ็คเกจ Gorilla Websocket ใน Go ได้อย่างไร

ไลบรารีนี้ช่วยให้เราเขียน ไคลเอ็นต์/เซิร์ฟเวอร์ websocket ใน Go ได้ง่าย มีการนำ Go ไปใช้จริงของโปรโตคอล websocket ซึ่งช่วยให้เราจัดการกับการเชื่อมต่อ http แบบเก็บสถานะได้โดยใช้ websockets

WebSockets – มันคืออะไร?


การกล่าวถึงเหตุผลที่เราใช้ WebSockets และความแตกต่างจากคำขอ HTTP แบบเดิม

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

ความงามที่แท้จริงของ WebSockets คือพวกเขาใช้การเชื่อมต่อ TCP ทั้งหมด 1 รายการและการสื่อสารทั้งหมดเสร็จสิ้นผ่านการเชื่อมต่อ TCP ที่มีอายุยาวนานเพียงครั้งเดียว วิธีนี้ช่วยลดปริมาณโอเวอร์เฮดของเครือข่ายที่ต้องใช้ในการสร้างแอปพลิเคชันแบบเรียลไทม์โดยใช้ WebSockets ได้อย่างมาก เนื่องจากไม่จำเป็นต้องมีการโพลปลายทาง HTTP อย่างต่อเนื่อง


ตอนนี้มาทำความเข้าใจว่าเราจะตั้งค่าแอปพลิเคชัน websocket ที่ทดสอบได้อย่างรวดเร็วโดยใช้ Gorilla ได้อย่างไร


สร้าง Go WebServer


สร้าง โฟลเดอร์ ชื่อ websocket สร้างไฟล์ Go Modules ด้วยคำสั่ง

go mod init websocket

สร้างไฟล์ main.go เขียนโค้ดดังนี้

package main

import (
    "fmt"
    "net/http"
)

func main() {
	http.HandleFunc("/" , handler)
	http.ListenAndServe(":4000", nil)
	
}

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello from go")
}



ทดสอบการทำงาน

go run main.go

เมื่อเราลองเรียกใช้สิ่งนี้โดยใช้go run main.goเราควรเห็นว่ามันเริ่มต้นเซิร์ฟเวอร์ HTTP ที่กำหนดไว้ใหม่ของเราได้สำเร็จ โดยไปที่เว็บบราวเซอร์ ป้อน URL http://localhost:4000/ คุณจะเห็นว่า Hello from go อยู่บนหน้าจอของคุณ


การติดตั้งแพ็คเกจ Gorilla Websocket Go


ไม่มีการพึ่งพาเพิ่มเติมนอกเหนือจากคอมไพเลอร์ Go ที่ใช้งานได้ ดังนั้นคุณเพียงแค่ต้องใช้ go get

Gorilla WebSocket เป็นการนำ Go ไปใช้ของโปรโตคอล WebSocket

go get github.com/gorilla/websocket

การอัพเกรดการเชื่อมต่อ HTTP


ในการสร้าง WebSocket endpoint เราจำเป็นต้องอัพเกรดการเชื่อมต่อขาเข้าจากจุดปลาย HTTP มาตรฐานไปเป็นการเชื่อมต่อ WebSocket ที่ยาวนาน เพื่อที่จะทำสิ่งนี้ เราจะใช้ฟังก์ชันบางอย่างจากแพ็คเกจ gorilla/websocket

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


กำหนดโปรแกรมอัปเกรดของเรา


สิ่งแรกที่เราจะต้องทำคือกำหนด websocker.Upgrader โครงสร้าง ซึ่งจะเก็บข้อมูลเช่นขนาดบัฟเฟอร์อ่านและเขียนสำหรับการเชื่อมต่อ WebSocket ของเรา:

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


การเรียกที่ CheckOrigin การดำเนินการนี้จะกำหนดว่าคำขอขาเข้าจากโดเมนอื่นได้รับอนุญาตให้เชื่อมต่อหรือไม่ และหากไม่ใช่ คำขอจะเกิดข้อผิดพลาด CORS

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin:     func(r *http.Request) bool { return true },
}


อัพเกรดการเชื่อมต่อของเรา


ในตอนนี้ เราสามารถเริ่มพยายามอัพเกรดการเชื่อมต่อ HTTP ขาเข้าโดยใช้ฟังก์ชัน upgrader.Upgrade() ซึ่งจะรับ Response Writer และตัวชี้ไปยังคำขอ HTTP และส่งคืนตัวชี้ไปยังการเชื่อมต่อ WebSocket หรือข้อผิดพลาดหากไม่สามารถอัพเกรดได้

func handler(w http.ResponseWriter, r *http.Request) {
	socket, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
        fmt.Println(err)
		return
    }
	for {
		msgType, msg, err := socket.ReadMessage()
		if err != nil {
			fmt.Println(err)
			return
		}
		fmt.Println(string(msg))
		if err = socket.WriteMessage(msgType, msg); err != nil {
			fmt.Println(err)
			return
		}
	}
}


โค้ดทั้งหมด

package main

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

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin:     func(r *http.Request) bool { return true },
}

func main() {

	http.HandleFunc("/" , handler)
	http.ListenAndServe(":4000", nil)
	
}

func handler(w http.ResponseWriter, r *http.Request) {
	socket, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
        fmt.Println(err)
		return
    }
	for {
		msgType, msg, err := socket.ReadMessage()
		if err != nil {
			fmt.Println(err)
			return
		}
		fmt.Println(string(msg))
		if err = socket.WriteMessage(msgType, msg); err != nil {
			fmt.Println(err)
			return
		}
	}
}



ทดสอบการทำงาน


go run main.go


ไปที่ http://livepersoninc.github.io/ws-test-page/


ที่ช่อง URL: ใส่

ws://localhost:4000

-> Connect


ช่อง Connection Status:  ใส่ ข้อความที่จะทดสอบในการส่ง เช่น Rock it with HTML5 Websocket แล้วกดปุ่ม Send Massage


ที่เทอมินอลของ Go จะแสดงข้อความ Rock it with HTML5 Websocket ที่รับเข้ามา

Leave a Reply

Your email address will not be published. Required fields are marked *