Golang是一種快速編譯、有效率、安全的程式語言,在網路開發方面也有廣泛的應用。其中,使用Golang搭建Websocket是一個非常流行的應用場景。本文將介紹如何使用Golang建構一個Websocket應用程式。
一、什麼是Websocket
Websocket是一種協議,它允許在瀏覽器和伺服器之間建立雙向通訊的連線。傳統的HTTP協定只能由瀏覽器向伺服器發出請求,並接收伺服器回應。但是,使用Websocket可以讓伺服器主動向瀏覽器發送訊息,實現了伺服器與瀏覽器的全雙工通訊。
二、Golang如何實作Websocket
Golang自帶了一個標準函式庫net/http
,這個套件提供了一個http.Server
結構體,它可以用來建構Web伺服器。除此之外,net/http
也提供了一個websocket
子包,它為我們提供了建構WebSocket伺服器所需的全部功能。
要建立WebSocket連接,客戶端需要向伺服器發送一個HTTP請求,並攜帶Upgrade頭部,指示請求升級為WebSocket協定。伺服器端在收到此請求後,需要檢查Upgrade頭部,並根據是否為WebSocket請求來進行相應的處理。
伺服器端可以使用websocket.IsWebSocketUpgrade
函數來檢查請求是否為WebSocket請求,並使用websocket.Upgrade
函數升級請求。升級成功後,伺服器就可以透過*websocket.Conn
類型的連線物件與客戶端進行通訊了。
func handler(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println(err) return } defer conn.Close() // 使用conn进行通信 }
其中,upgrader
是一個websocket.Upgrader
類型的變量,透過設定它的屬性可以控制WebSocket連線的處理方式。 Upgrade
函數在升級請求時會阻塞,因此要將其放在goroutine中運行。
一旦WebSocket連線建立成功,客戶端和伺服器都可以透過*websocket.Conn
物件進行通訊。使用這個物件可以發送和接收WebSocket訊息。
傳送訊息很簡單,只需要呼叫WriteMessage
方法:
err := conn.WriteMessage(websocket.TextMessage, []byte("hello"))
接收訊息的方法有三種:
ReadMessage
:阻塞讀取,直到有訊息到來NextReader
:阻塞等待下一個訊息到來NextWriter
:傳回一個io.WriteCloser
對象,可以使用這個對象發送訊息一般使用ReadMessage
方法接收WebSocket訊息:
_, message, err := conn.ReadMessage() if err != nil { log.Println(err) return } log.Printf("recv: %s", message)
三、一個簡單的WebSocket應用程式
在這個範例中,我們將建立一個簡單的聊天室應用程式,客戶端發送訊息之後,伺服器將訊息廣播給所有連接的客戶端。
客戶端程式碼:(使用JavaScript)
<!DOCTYPE html> <html> <head> <title>Chatroom</title> </head> <body> <input type="text" id="input-message"/> <button onclick="sendMessage()">发送</button> <ul id="message-list"></ul> <script> var ws = new WebSocket("ws://localhost:8080/ws"); ws.onmessage = function(event) { var message = event.data; var li = document.createElement("li"); li.appendChild(document.createTextNode(message)); document.getElementById("message-list").appendChild(li); }; function sendMessage() { var message = document.getElementById("input-message").value; ws.send(message); } </script> </body> </html>
伺服器端程式碼:
package main import ( "fmt" "log" "net/http" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{} func main() { http.HandleFunc("/ws", wsHandler) err := http.ListenAndServe(":8080", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } } func wsHandler(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println(err) return } defer conn.Close() for { _, message, err := conn.ReadMessage() if err != nil { log.Println(err) break } fmt.Printf("recv: %s ", message) // 广播给所有客户端 for _, conn := range conns { err := conn.WriteMessage(websocket.TextMessage, message) if err != nil { log.Println(err) break } } } }
在上面的程式碼中,我們將所有連接的websocket.Conn
物件儲存在conns
變數中。每當有一個新訊息到來時,伺服器會將訊息廣播給所有客戶端。
總結
使用Golang建立WebSocket應用程式非常簡單,只需要匯入net/http
和websocket
套件即可,直接使用標準庫提供的API即可完成WebSocket應用程式的開發。希望此文章能夠對Golang Websocket開發有所幫助。
以上是golang搭建websocket的詳細內容。更多資訊請關注PHP中文網其他相關文章!