網頁

2022/12/2

Golang WebSocket hello world

Go WebSocket hello world範例。


本篇在Go程式利用gorilla/websocket套件做一個簡單的WebSocket server。

範例環境:

  • Go 1.19
  • github.com/gorilla/websocket v1.5.0


安裝Websocket

在Go專案根目錄以命令列執行go get github.com/gorilla/websocket安裝gorilla/websocket

~/../go-demo % go get github.com/gorilla/websocket
go: added github.com/gorilla/websocket v1.5.0


範例

取得websocket.Upgrader物件並設定屬性CheckOrigin函式回傳結果為true來允許CORS請求。

呼叫http.HandlerFunc設定一個接收請求的路徑/echo及處理請求的echoHandler

呼叫http.ListenAndServe啟動WebSocket伺服器,port為8080。

echoHandler呼叫websocket.Upgrader.Upgrade方法取得WebSocket連線物件websocket.Conn

在一個for無窮迴圈中呼叫Conn.ReadMessage持續讀取client送來的訊息。
第一個回傳參數為message type,通常是TextMessage = 1BinaryMessage = 2
第二個回傳參數為message的byte陣列。

收到訊息console印出訊息後,呼叫Conn.WriteMessage把收來的訊息寫出給client。

main.go

package main

import (
    "fmt"
    "net/http"

    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool {
        return true // allow CORS request's Origin header
    },
}

func main() {
    http.HandleFunc("/echo", echoHandler)
    http.ListenAndServe(":8080", nil)
}

func echoHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil) // get a websocket connection
    if err != nil {
        panic(err)
    }
    defer conn.Close()
    for {
        mt, message, err := conn.ReadMessage() // read messages from client
        if err != nil {
            panic(err)
        }

        fmt.Printf("receive: %s\n", message)
        err = conn.WriteMessage(mt, message) // write messages to client
        if err != nil {
            panic(err)
        }
    }
}

github



測試

啟動Go專案。

在Chrome瀏覽器安裝Simple WebSocket Client並打開。
在[Server Location]的[URL]欄位輸入ws://localhost:8080/echo為接收請求的資源路徑。
在[Resquest]欄位輸入"hello world"然後點選Send

Server的console會印出"receive: hello world"。

WebSocket Client的[MessageLog]印出從server回傳的"hello world"。




沒有留言:

張貼留言