go語言使用gorilla/websocket實(shí)現(xiàn)websocket
前言
Gorilla WebSocket 是一個(gè)用于 Go 語言的 WebSocket 協(xié)議實(shí)現(xiàn),而且是一個(gè)優(yōu)秀的組件庫,能快速實(shí)現(xiàn)websocket
協(xié)議
websocket實(shí)現(xiàn)
依賴安裝
使用以下依賴安裝對應(yīng)的庫
go get github.com/gorilla/websocket
程序?qū)崿F(xiàn)
package main import ( "fmt" "github.com/gorilla/websocket" "log" "net/http" ) var upgrader = websocket.Upgrader{ ReadBufferSize: 4196, WriteBufferSize: 1124, CheckOrigin: func(r *http.Request) bool { //if r.Method != "GET" { // fmt.Println("method is not GET") // return false //} //if r.URL.Path != "/ws" { // fmt.Println("path error") // return false //} return true }, } var m map[string]*websocket.Conn // ServerHTTP 用于升級協(xié)議 func ServerHTTP(w http.ResponseWriter, r *http.Request) { // 收到http請求之后升級協(xié)議 conn1, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println("Error during connection upgrade:", err) return } userId := r.FormValue("userId") log.Println("userId:" + userId) defer conn1.Close() m[userId] = conn1 conn := m[userId] for { // 服務(wù)端讀取客戶端請求 messageType, message, err := conn.ReadMessage() if err != nil { log.Println("Error during message reading:", err) break } log.Printf("Received:%s", message) // 開啟關(guān)閉連接監(jiān)聽 conn.SetCloseHandler(func(code int, text string) error { fmt.Println(code, text) // 斷開連接時(shí)將打印code和text return nil }) //服務(wù)端給客戶端返回請求 err = conn.WriteMessage(messageType, message) conn.WriteMessage(websocket.TextMessage, []byte("aaa")) if err != nil { log.Println("Error during message writing:", err) return } } } func home(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Index Page") } func main() { //a, _ := strconv.Atoi("1") //fmt.Println(a) m = make(map[string]*websocket.Conn) // 創(chuàng)建HTTP服務(wù)器 http.HandleFunc("/ws", ServerHTTP) log.Println("Server started on :8080") log.Fatal(http.ListenAndServe(":8080", nil)) }
啟動之后
使用postman
連接服務(wù)端
發(fā)送消息
總結(jié)
Gorilla WebSocket 提供了一個(gè)完整且經(jīng)過測試的 WebSocket 協(xié)議實(shí)現(xiàn),適用于構(gòu)建高效的 WebSocket 應(yīng)用程序
到此這篇關(guān)于go語言使用gorilla/websocket實(shí)現(xiàn)websocket的文章就介紹到這了,更多相關(guān)go websocket內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入了解Go語言中web框架的中間件運(yùn)行機(jī)制
大家在使用iris框架搭建web系統(tǒng)時(shí),一定會用到中間件。那么你了解中間件的運(yùn)行機(jī)制嗎?你知道為什么在iris和gin框架的請求處理函數(shù)中要加c.Next()函數(shù)嗎?本文就和大家一起探究該問題的答案2023-02-02讓goland支持proto文件類型的實(shí)現(xiàn)
這篇文章主要介紹了讓goland支持proto文件類型的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12go語言切片slice使用細(xì)節(jié)和注意事項(xiàng)整理大全
這篇文章主要給大家介紹了關(guān)于go語言切片slice使用細(xì)節(jié)和注意事項(xiàng)整理的相關(guān)資料,需要的朋友可以參考下2024-05-05簡單聊聊Go語言中空結(jié)構(gòu)體和空字符串的特殊之處
在日常的編程過程中,大家應(yīng)該經(jīng)常能遇到各種”空“吧,比如空指針、空結(jié)構(gòu)體、空字符串等,本文就以?Go?語言為例,一起來看看空結(jié)構(gòu)體和空字符串在?Go?語言中的特殊之處吧2024-03-03go語言實(shí)現(xiàn)mqtt協(xié)議的實(shí)踐
MQTT是一個(gè)基于客戶端-服務(wù)器的消息發(fā)布/訂閱傳輸協(xié)議。本文主要介紹了go語言實(shí)現(xiàn)mqtt協(xié)議的實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Golang使用archive/zip包實(shí)現(xiàn)ZIP壓縮與解壓
Golang?中的?archive/zip?包用于處理?ZIP?格式的壓縮文件,提供了一系列用于創(chuàng)建、讀取和解壓縮?ZIP?格式文件的函數(shù)和類型,使用起來非常方便,下面就跟隨小編一起了解一下具體使用方法吧2023-08-08