旅行社网站程序,品牌网站建设找顺的,绍兴做网站选哪家,微推客golang使用 Gin实现 websocket#xff0c;这里笔者重新搭建一个项目 1、创建项目安装依赖
项目名为 go-gin-websocket
在指定文件夹下#xff0c;新建项目文件夹 go-gin-websocket 进入项目文件夹#xff0c;打开cmd窗口#xff0c;在项目#xff08;go-gin-websocket这里笔者重新搭建一个项目 1、创建项目安装依赖
项目名为 go-gin-websocket
在指定文件夹下新建项目文件夹 go-gin-websocket 进入项目文件夹打开cmd窗口在项目go-gin-websocket文件夹路径下执行初始化命令 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、搭建项目
在项目目录下新建controller、static、templates、ws文件夹分别用来存放controller代码、静态文件、页面、websocket代码 在templates目录下新建 index.html页面
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title
/head
body
hello
scriptvar webSocket;try {webSocket new WebSocket(ws://127.0.0.1:8080/ws?idabc123456789);}catch (e) {console.log(e)}webSocket.onerror function(event) {}//与WebSocket建立连接webSocket.onopen function(event) {console.log(建立连接)console.log(JSON.stringify(event))var msg 身无彩凤双飞翼心有灵犀一点通//发送消息webSocket.send(msg);};//接收服务端发送的消息webSocket.onmessagefunction (m) {console.log(m)console.log(m.data)}
/script
/body
/html
在controller目录下新建 page_controller.go
package controllerimport github.com/gin-gonic/ginfunc Index(c *gin.Context) {c.HTML(200, index.html, nil)
}在ws目录下新建 websocket.go
package wsimport (fmtgithub.com/gin-gonic/gingithub.com/gorilla/websocketlognet/http
)func InitWebSocket(c *gin.Context) {var upgrader websocket.Upgrader{ReadBufferSize: 1024,WriteBufferSize: 1024,CheckOrigin: func(r *http.Request) bool {log.Println(升级协议, 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(获取客户端发送的消息: string(message))fmt.Println(mt)if err ! nil {log.Println(err)break}var msg 春风得意马蹄疾,一日看尽长安花err2 : conn.WriteMessage(websocket.TextMessage, []byte(msg))if err2 ! nil {log.Println(write:, err2)break}}}在项目根目录下新建 main.go main.go内容
package mainimport (github.com/gin-gonic/gingo-gin-websocket/controllergo-gin-websocket/ws
)func main() {e : gin.Default()//html页面位置e.LoadHTMLGlob(templates/*)//静态文件位置e.Static(/static, ./static)e.GET(/, controller.Index)e.GET(/ws, ws.InitWebSocket)e.Run(0.0.0.0:8080)
}3、运行测试
浏览器请求 http://localhost:8080/ 4、添加session
添加session用来存储在线用户
这里使用一个map用来保存key是用户idvalue是websocket连接再加一个读写锁保证线程安全
package wsimport (fmtgithub.com/gin-gonic/gingithub.com/gorilla/websocketlognet/httpsync
)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(升级协议, 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(获取客户端发送的消息: string(message))fmt.Println(mt)if err ! nil {log.Println(err)break}var msg 春风得意马蹄疾,一日看尽长安花err2 : conn.WriteMessage(websocket.TextMessage, []byte(msg))if err2 ! nil {log.Println(write:, err2)break}}}至此完