Golang Websocket開發指南:實作多人線上協作功能
#引言:
Websocket是一種在客戶端和伺服器之間建立持久性連線的通訊協議,它可以實現伺服器主動向客戶端推送訊息的功能。在實際應用中,Websocket廣泛應用於即時通知、聊天室、多人線上協作等場景。本文將介紹如何使用Golang開發Websocket應用,並結合程式碼範例,示範如何實現多人線上協作功能。
一、Golang Websocket簡介
Golang自帶了內建的Websocket庫,方便開發者快速建立Websocket應用程式。使用Golang的Websocket庫,可以輕鬆實現Websocket的連線、訊息收發、連線池管理等功能。
二、Golang Websocket開發環境配置
安裝Golang Websocket庫
三、Golang Websocket開發流程
定義連接池
後續範例程式碼將使用一個全域的連接池來管理所有用戶端的Websocket連接,以實現多人線上協作的功能。定義一個結構體類型的連接池,結構體中的欄位包括一個互斥鎖和一個儲存連接的切片。
type ConnPool struct { connLock sync.Mutex conns []*websocket.Conn }
處理WebSocket請求
在Golang中,透過Http套件可以監聽處理HTTP請求。我們需要編寫一個處理Websocket請求的函數,並在Http伺服器中註冊該函數。
func wsHandler(w http.ResponseWriter, r *http.Request) { conn, err := websocket.Upgrade(w, r, nil, 1024, 1024) if err != nil { log.Println("websocket upgrade failed:", err) return } // 将连接添加到连接池中 pool.add(conn) // 具体的消息处理逻辑 go handleMessages(conn) }
訊息處理邏輯
在範例程式碼中,我們使用了一個goroutine來處理每個連接的訊息收發。透過讀取連線上的消息,實現多人線上協作的功能。當有新的訊息發送時,透過連接池遍歷所有連接並發送訊息。
func handleMessages(conn *websocket.Conn) { for { message := "" err := conn.ReadJSON(&message) if err != nil { log.Println("read message failed:", err) // 从连接池中删除连接 pool.remove(conn) break } // 遍历连接池,广播消息 pool.broadcast(message) } }
啟動Websocket伺服器
寫一個函數來啟動Websocket伺服器。在該函數中,我們需要建立Http伺服器實例,並綁定處理Websocket請求的函數。
func startServer() { http.HandleFunc("/ws", wsHandler) http.ListenAndServe(":8000", nil) }
完整範例程式碼
以下是完整的Websocket應用程式範例程式碼:
package main import ( "log" "net/http" "sync" "github.com/gorilla/websocket" ) type ConnPool struct { connLock sync.Mutex conns []*websocket.Conn } var pool ConnPool func (p *ConnPool) add(conn *websocket.Conn) { p.connLock.Lock() defer p.connLock.Unlock() p.conns = append(p.conns, conn) } func (p *ConnPool) remove(conn *websocket.Conn) { p.connLock.Lock() defer p.connLock.Unlock() newConns := make([]*websocket.Conn, 0, len(p.conns)-1) for _, c := range p.conns { if c != conn { newConns = append(newConns, c) } } p.conns = newConns } func (p *ConnPool) broadcast(message string) { p.connLock.Lock() defer p.connLock.Unlock() for _, conn := range p.conns { err := conn.WriteJSON(message) if err != nil { log.Println("write message failed:", err) } } } func wsHandler(w http.ResponseWriter, r *http.Request) { conn, err := websocket.Upgrade(w, r, nil, 1024, 1024) if err != nil { log.Println("websocket upgrade failed:", err) return } pool.add(conn) go handleMessages(conn) } func handleMessages(conn *websocket.Conn) { for { message := "" err := conn.ReadJSON(&message) if err != nil { log.Println("read message failed:", err) pool.remove(conn) break } pool.broadcast(message) } } func startServer() { http.HandleFunc("/ws", wsHandler) http.ListenAndServe(":8000", nil) } func main() { startServer() }
四、運行範例
go build main.go ./main
以上是golang Websocket開發指南:實現多人線上協作功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!