Golang實(shí)現(xiàn)WebSocket服務(wù)的項(xiàng)目實(shí)踐
我們每天接觸到各類應(yīng)用,如社交、在線文檔、直播等,后端都需要使用WebSocket技術(shù)提供實(shí)時(shí)通信能力。本文介紹如何使用Golang實(shí)現(xiàn)實(shí)時(shí)后端WebSocket服務(wù),首先使用Gin框架搭建http服務(wù),然后使用gorilla/websocket庫實(shí)現(xiàn)簡單后端WebSocket服務(wù),示例實(shí)現(xiàn)從0到1的過程,適合初學(xué)者快速入門。
Gin實(shí)現(xiàn)Web應(yīng)用
創(chuàng)建Go工程,新增hello.go文件,編寫下面代碼:
package main import "fmt" func main() { ? ? ?fmt.Println("Hello, World!") }
運(yùn)行可以看到輸出結(jié)果。下面增加Web服務(wù)功能。安裝Gin庫依賴:
go get -u github.com/gin-gonic/gin
修改上面hello.go文件內(nèi)容:
package main import ( ? "fmt" ? "github.com/gin-gonic/gin" ) func main() { ? ? fmt.Println("Hello, World!") ? ? // 創(chuàng)建Gin引擎實(shí)例 ? ? 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服務(wù) ? ? r.Run()? }
運(yùn)行程序,訪問地址:http://localhost:8080/ping,返回結(jié)果:
{ "message": "pong" }
實(shí)現(xiàn)WebSocket服務(wù)
創(chuàng)建server.go,修改hello.go文件的main方法為hello(),同一包下不能有兩個(gè)main方法。需要安裝相應(yīng)的庫:go get -u github.com/gorilla/websocket,增加下面內(nèi)容:
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 讀取數(shù)據(jù) ? ?mt, message, err := ws.ReadMessage() ? ?if err != nil { ? ? log.Println("read:", err) ? ? break ? ?} ? ?log.Printf("recv: %s", message) ? ?//往 ws 寫數(shù)據(jù) ? ?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") }
核心邏輯為:收到消息后,往客戶端寫回相同內(nèi)容。代碼增加了注釋,主要差異就是for循環(huán)中的讀寫消息。下面需要html文件進(jìn)行交互,新建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"); ? ? ? ? ?//打開連接時(shí)觸發(fā) ? ? ? ? ?ws.onopen = function(evt) { ? ? ? ? ? ? ?console.log("Connection open..."); ? ? ? ? ? ? ?ws.send("Hello WebSockets!"); ? ? ? ? ?}; ? ? ? ? ?//接收到消息時(shí)觸發(fā) ? ? ? ? ?ws.onmessage = function(evt) { ? ? ? ? ? ? ?console.log("Received Message: " + evt.data); ? ? ? ? ?}; ? ? ? ? ?//連接關(guān)閉時(shí)觸發(fā) ? ? ? ? ?ws.onclose = function(evt) { ? ? ? ? ? ? ?console.log("Connection closed."); ? ? ? ? ?}; ? ? ?</script> ? ? ?Hello WebSocket. </body> </html>
script標(biāo)簽中定義了三個(gè)回調(diào)函數(shù),連接ws后給服務(wù)端發(fā)送消息,服務(wù)端收到消息返回相同內(nèi)容,最后時(shí)關(guān)閉連接時(shí)觸發(fā)。
啟動測試
首先啟動ws,go run server.go, 啟動服務(wù)端后等待客戶端連接。下面啟動客戶端,我們可以使用vs code live server啟動訪問靜態(tài)頁面,也可以使用python啟動http服務(wù)。在項(xiàng)目目錄下打開命令行界面,輸入下面命令,啟用http服務(wù):
python -m http.server 9000
通過瀏覽器訪問 http://localhost:9000/index.html , 打開瀏覽器控制臺可以看到信息:
Connection open...
index.html:21 Received Message: Hello WebSockets!
index.html:25 Connection closed.
首先看到第一行(連接成功打印的日志),然后是接收服務(wù)端發(fā)送的信息。最后關(guān)閉服務(wù)端程序,客戶端打印連接斷開日志。
到此這篇關(guān)于Golang實(shí)現(xiàn)WebSocket服務(wù)的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)Golang WebSocket服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Go語言實(shí)現(xiàn)百萬級WebSocket連接架構(gòu)設(shè)計(jì)及服務(wù)優(yōu)化
- 一文帶你使用golang手?jǐn)]一個(gè)websocket中間件
- 使用Golang創(chuàng)建單獨(dú)的WebSocket會話
- Golang?WebSocket創(chuàng)建單獨(dú)會話詳細(xì)實(shí)例
- Golang構(gòu)建WebSocket服務(wù)器和客戶端的示例詳解
- golang用melody搭建輕量的websocket服務(wù)的示例代碼
- 基于Go+WebSocket實(shí)現(xiàn)實(shí)時(shí)通信功能
- Go語言實(shí)現(xiàn)websocket推送程序
- Go?實(shí)現(xiàn)?WebSockets之創(chuàng)建?WebSockets
- 深入理解Golang中WebSocket和WSS的支持
相關(guān)文章
golang中byte和rune用法及新手易錯點(diǎn)總結(jié)
golang內(nèi)置類型有rune類型和byte類型,下面這篇文章主要給大家介紹了關(guān)于golang中byte和rune用法及新手易錯點(diǎn)總結(jié)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-037分鐘讀懂Go的臨時(shí)對象池pool以及其應(yīng)用場景
這篇文章主要給大家介紹了關(guān)于如何通過7分鐘讀懂Go的臨時(shí)對象池pool以及其應(yīng)用場景的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或使用Go具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧2018-11-11Go語言的變量、函數(shù)、Socks5代理服務(wù)器示例詳解
這篇文章主要介紹了Go語言的變量、函數(shù)、Socks5代理服務(wù)器的相關(guān)資料,需要的朋友可以參考下2017-09-09Golang使用cobra實(shí)現(xiàn)命令行程序的示例代碼
Cobra 是 Go 語言中一個(gè)強(qiáng)大的命令行應(yīng)用庫,它提供了創(chuàng)建命令行工具所需的基本結(jié)構(gòu)和功能,被許多開發(fā)者用于構(gòu)建各種命令行工具和應(yīng)用程序,本文將給大家介紹Golang使用cobra實(shí)現(xiàn)命令行程序,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02go語言區(qū)塊鏈實(shí)戰(zhàn)實(shí)現(xiàn)簡單的區(qū)塊與區(qū)塊鏈
這篇文章主要為大家介紹了go語言區(qū)塊鏈的實(shí)戰(zhàn)學(xué)習(xí),來實(shí)現(xiàn)簡單的區(qū)塊與區(qū)塊鏈?zhǔn)纠^程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10