Golang實現(xiàn)WebSocket服務的項目實踐
我們每天接觸到各類應用,如社交、在線文檔、直播等,后端都需要使用WebSocket技術提供實時通信能力。本文介紹如何使用Golang實現(xiàn)實時后端WebSocket服務,首先使用Gin框架搭建http服務,然后使用gorilla/websocket庫實現(xiàn)簡單后端WebSocket服務,示例實現(xiàn)從0到1的過程,適合初學者快速入門。
Gin實現(xiàn)Web應用
創(chuàng)建Go工程,新增hello.go文件,編寫下面代碼:
package main import "fmt" func main() { ? ? ?fmt.Println("Hello, World!") }
運行可以看到輸出結果。下面增加Web服務功能。安裝Gin庫依賴:
go get -u github.com/gin-gonic/gin
修改上面hello.go文件內容:
package main import ( ? "fmt" ? "github.com/gin-gonic/gin" ) func main() { ? ? fmt.Println("Hello, World!") ? ? // 創(chuàng)建Gin引擎實例 ? ? r := gin.Default() ? ? // 增加路由ping,簡單返回pong ? ? r.GET("/ping", func(c *gin.Context) { ? ? ? ? c.JSON(200, gin.H{ ? ? ? ? ? ? "message": "pong", ? ? ? ? }) ? ? }) ? ? // listen and serve on 0.0.0.0:8080 ? ? // 啟動HTTP服務 ? ? r.Run()? }
運行程序,訪問地址:http://localhost:8080/ping,返回結果:
{ "message": "pong" }
實現(xiàn)WebSocket服務
創(chuàng)建server.go,修改hello.go文件的main方法為hello(),同一包下不能有兩個main方法。需要安裝相應的庫:go get -u github.com/gorilla/websocket,增加下面內容:
package main import ( ? "fmt" ? "log" ? "net/http" ? "github.com/gin-gonic/gin" ? "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{ ? // 解決跨域問題 ? CheckOrigin: func(r *http.Request) bool { ? ? return true ? }, }? func ws(c *gin.Context) { ? //更新get請求使用WebSocket協(xié)議 ? ws, err := upgrader.Upgrade(c.Writer, c.Request, nil) ? if err != nil { ? ?log. Print("upgrade:", err) ? ?return ? } ? defer ws.Close() ? // 監(jiān)聽 ws 消息 ? for { ? ?// 從 ws 讀取數據 ? ?mt, message, err := ws.ReadMessage() ? ?if err != nil { ? ? log.Println("read:", err) ? ? break ? ?} ? ?log.Printf("recv: %s", message) ? ?//往 ws 寫數據 ? ?err = ws.WriteMessage(mt, message) ? ?if err != nil { ? ? log.Println("write:", err) ? ? break ? ?} ? } } func main() { ? ? fmt.Println("Websocket Server!") ? ? r := gin.Default() ? ? r.GET("/ws", ws) ? ? r.Run("localhost:8448") }
核心邏輯為:收到消息后,往客戶端寫回相同內容。代碼增加了注釋,主要差異就是for循環(huán)中的讀寫消息。下面需要html文件進行交互,新建index.html文件:
<!DOCTYPE html> <html lang="en"> <head> ? ? ?<meta charset="UTF-8"> ? ? ?<meta http-equiv="X-UA-Compatible" content="IE=edge"> ? ? ?<meta name="viewport" content="width=device-width, initial-scale=1.0"> ? ? ?<title>Univer Server</title> </head> <body> ? ? ?<script> ? ? ? ? ?var ws = new WebSocket("ws://localhost:8448/ws"); ? ? ? ? ?//打開連接時觸發(fā) ? ? ? ? ?ws.onopen = function(evt) { ? ? ? ? ? ? ?console.log("Connection open..."); ? ? ? ? ? ? ?ws.send("Hello WebSockets!"); ? ? ? ? ?}; ? ? ? ? ?//接收到消息時觸發(fā) ? ? ? ? ?ws.onmessage = function(evt) { ? ? ? ? ? ? ?console.log("Received Message: " + evt.data); ? ? ? ? ?}; ? ? ? ? ?//連接關閉時觸發(fā) ? ? ? ? ?ws.onclose = function(evt) { ? ? ? ? ? ? ?console.log("Connection closed."); ? ? ? ? ?}; ? ? ?</script> ? ? ?Hello WebSocket. </body> </html>
script標簽中定義了三個回調函數,連接ws后給服務端發(fā)送消息,服務端收到消息返回相同內容,最后時關閉連接時觸發(fā)。
啟動測試
首先啟動ws,go run server.go, 啟動服務端后等待客戶端連接。下面啟動客戶端,我們可以使用vs code live server啟動訪問靜態(tài)頁面,也可以使用python啟動http服務。在項目目錄下打開命令行界面,輸入下面命令,啟用http服務:
python -m http.server 9000
通過瀏覽器訪問 http://localhost:9000/index.html , 打開瀏覽器控制臺可以看到信息:
Connection open...
index.html:21 Received Message: Hello WebSockets!
index.html:25 Connection closed.
首先看到第一行(連接成功打印的日志),然后是接收服務端發(fā)送的信息。最后關閉服務端程序,客戶端打印連接斷開日志。
到此這篇關于Golang實現(xiàn)WebSocket服務的項目實踐的文章就介紹到這了,更多相關Golang WebSocket服務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Go語言實現(xiàn)百萬級WebSocket連接架構設計及服務優(yōu)化
- 一文帶你使用golang手擼一個websocket中間件
- 使用Golang創(chuàng)建單獨的WebSocket會話
- Golang?WebSocket創(chuàng)建單獨會話詳細實例
- Golang構建WebSocket服務器和客戶端的示例詳解
- golang用melody搭建輕量的websocket服務的示例代碼
- 基于Go+WebSocket實現(xiàn)實時通信功能
- Go語言實現(xiàn)websocket推送程序
- Go?實現(xiàn)?WebSockets之創(chuàng)建?WebSockets
- 深入理解Golang中WebSocket和WSS的支持
相關文章
Golang使用cobra實現(xiàn)命令行程序的示例代碼
Cobra 是 Go 語言中一個強大的命令行應用庫,它提供了創(chuàng)建命令行工具所需的基本結構和功能,被許多開發(fā)者用于構建各種命令行工具和應用程序,本文將給大家介紹Golang使用cobra實現(xiàn)命令行程序,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下2024-02-02go語言區(qū)塊鏈實戰(zhàn)實現(xiàn)簡單的區(qū)塊與區(qū)塊鏈
這篇文章主要為大家介紹了go語言區(qū)塊鏈的實戰(zhàn)學習,來實現(xiàn)簡單的區(qū)塊與區(qū)塊鏈示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10