การใช้ 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 ที่รับเข้ามา