websocket应用场景:
1、即时通信。比如QQ,微信这些。
2、站内消息推送,比如打开qq时会提示xx用户已上线之类在app或者网站内部的消息。
3、实时数据获取。比如地理位置,用户是否在线等需要实时获取的消息。
4、解决http长轮询消耗服务器资源问题。
需要使用的框架:
1、gin框架:gin-gonic/gin
2、websocket框架:gorilla/websocket
3、api文档:
https://godoc.org/github.com/gin-gonic/gin
https://godoc.org/github.com/gorilla/websocket#Conn.ReadJSON
示例代码:
package main
import (
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
"net/http"
)
//设置websocket
//CheckOrigin防止跨站点的请求伪造
var upGrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true
},
}
//websocket实现
func ping(c *gin.Context) {
//升级get请求为webSocket协议
ws, err := upGrader.Upgrade(c.Writer, c.Request, nil)
if err != nil {
return
}
defer ws.Close() //返回前关闭
for {
//读取ws中的数据
mt, message, err := ws.ReadMessage()
if err != nil {
break
}
//写入ws数据
err = ws.WriteMessage(mt, message)
if err != nil {
break
}
}
}
func main() {
r := gin.Default()
r.GET("/ping", ping)
r.Run(":12345")
}
测试:
websocket请求地址:ws://localhost:12345/ping
实际应用中的分析:
上面的例子只是实现了最基本的websocket功能,客户端发送消息,服务端接收到以后就按原样返回(json数据会作BASE64加密)。但在实际的项目中,需要处理的逻辑远比这个复杂。而且数据在传输过程中没有加密,因此在实际应用中,使用json加密后传输。客户端或服务端接收到的只是一串字符串,内部解密后再进行相应的业务逻辑处理。如果业务逻辑复杂,可以配合channel,redis,mysql等一起使用。
参考文章:
gin 框架中结合 gorilla 实现 webSocket - 链滴ld246.com