政府網(wǎng)站數(shù)據(jù)開放 建設(shè)方案網(wǎng)絡(luò)營(yíng)銷師證書有用嗎
golang使用?Gin實(shí)現(xiàn) websocket,這里筆者重新搭建一個(gè)項(xiàng)目
1、創(chuàng)建項(xiàng)目安裝依賴
項(xiàng)目名為?go-gin-websocket
在指定文件夾下,新建項(xiàng)目文件夾?go-gin-websocket
進(jìn)入項(xiàng)目文件夾,打開cmd窗口,在項(xiàng)目(go-gin-websocket)文件夾路徑下,執(zhí)行初始化命令?go mod init?go-gin-websocket
go mod init?go-gin-websocket
安裝依賴
安裝gin
go get -u github.com/gin-gonic/gin
?安裝websocket
go get github.com/gorilla/websocket
2、搭建項(xiàng)目
在項(xiàng)目目錄下新建controller、static、templates、ws文件夾,分別用來(lái)存放controller代碼、靜態(tài)文件、頁(yè)面、websocket代碼
在templates目錄下新建 index.html頁(yè)面
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
hello
<script>var webSocket;try {webSocket = new WebSocket('ws://127.0.0.1:8080/ws?id=abc123456789');}catch (e) {console.log(e)}webSocket.onerror = function(event) {}//與WebSocket建立連接webSocket.onopen = function(event) {console.log('建立連接')console.log(JSON.stringify(event))var msg = "身無(wú)彩鳳雙飛翼,心有靈犀一點(diǎn)通"//發(fā)送消息webSocket.send(msg);};//接收服務(wù)端發(fā)送的消息webSocket.onmessage=function (m) {console.log(m)console.log(m.data)}
</script>
</body>
</html>
在controller目錄下新建?page_controller.go
package controllerimport "github.com/gin-gonic/gin"func Index(c *gin.Context) {c.HTML(200, "index.html", nil)
}
在ws目錄下新建?websocket.go
package wsimport ("fmt""github.com/gin-gonic/gin""github.com/gorilla/websocket""log""net/http"
)func InitWebSocket(c *gin.Context) {var upgrader = websocket.Upgrader{ReadBufferSize: 1024,WriteBufferSize: 1024,CheckOrigin: func(r *http.Request) bool {log.Println("升級(jí)協(xié)議", r.Header["User-Agent"])return true},}conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)if err != nil {log.Println(err)return}defer conn.Close()userId := c.Query("id")log.Println("用戶id:", userId)for {mt, message, err := conn.ReadMessage()log.Println("獲取客戶端發(fā)送的消息:" + string(message))fmt.Println(mt)if err != nil {log.Println(err)break}var msg = "春風(fēng)得意馬蹄疾,一日看盡長(zhǎng)安花"err2 := conn.WriteMessage(websocket.TextMessage, []byte(msg))if err2 != nil {log.Println("write:", err2)break}}}
在項(xiàng)目根目錄下新建?main.go
main.go內(nèi)容
package mainimport ("github.com/gin-gonic/gin""go-gin-websocket/controller""go-gin-websocket/ws"
)func main() {e := gin.Default()//html頁(yè)面位置e.LoadHTMLGlob("templates/*")//靜態(tài)文件位置e.Static("/static", "./static")e.GET("/", controller.Index)e.GET("/ws", ws.InitWebSocket)e.Run("0.0.0.0:8080")
}
3、運(yùn)行測(cè)試
瀏覽器請(qǐng)求?http://localhost:8080/
4、添加session
添加session用來(lái)存儲(chǔ)在線用戶
這里使用一個(gè)map用來(lái)保存,key是用戶id,value是websocket連接,再加一個(gè)讀寫鎖保證線程安全
package wsimport ("fmt""github.com/gin-gonic/gin""github.com/gorilla/websocket""log""net/http""sync"
)var connects = make(map[string]*websocket.Conn)
var lock sync.RWMutexfunc addSession(id string, conn *websocket.Conn) {lock.Lock()connects[id] = conndefer lock.Unlock()
}
func getSession(id string) *websocket.Conn {lock.RLock()defer lock.RUnlock()return connects[id]
}
func removeSession(id string) {lock.Lock()delete(connects, id)defer lock.Unlock()
}func InitWebSocket(c *gin.Context) {var upgrader = websocket.Upgrader{ReadBufferSize: 1024,WriteBufferSize: 1024,CheckOrigin: func(r *http.Request) bool {log.Println("升級(jí)協(xié)議", r.Header["User-Agent"])return true},}conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)if err != nil {log.Println(err)return}defer conn.Close()userId := c.Query("id")log.Println("用戶id:", userId)//添加sessionaddSession(userId, conn)for {mt, message, err := conn.ReadMessage()log.Println("獲取客戶端發(fā)送的消息:" + string(message))fmt.Println(mt)if err != nil {log.Println(err)break}var msg = "春風(fēng)得意馬蹄疾,一日看盡長(zhǎng)安花"err2 := conn.WriteMessage(websocket.TextMessage, []byte(msg))if err2 != nil {log.Println("write:", err2)break}}}
至此完