WebSocket是什么
开发前期准备(默认已经安装了golang
语言环境)
拉取
gorilla/websocket
到GOPATH
的src
下的github.com
目录里面git clone https://github.com/gorilla/websocket
拉取
gin-gonic/gin
到GOPATH
的src
下的github.com
目录里面git clone https://github.com/gin-gonic/gin
WebSocket 简单使用开发(内部并发不安全,服务端server
)
开发逻辑
定义将
HTTP
升级成WebSocket
的全局变量upgrade
,并默认允许跨域。var ( upgrade = &websocket.Upgrader{ // 允许跨域 CheckOrigin: func(r *http.Request) bool { return true }, } )
确定服务的基本结构,即确定
main
函数的结构func main(){ r := gin.Default() r.GET("/test",func(c *gin.Context){}) err := r.Run(":1234") if err != nil{ return } }
完善内部逻辑
func handler(c *gin.Context) { // 定义两个变量,其一就是*websocket.Conn,其二就是error var ( conn *websocket.Conn err error ) // 赋值变量,这里就用到了前面定义的upgrade // conn这结构体内有许多功能,可以都尝试一下,当一般常使用: // conn.ReadMessage() // conn.WriteMessage() // conn.Close() if conn, err = upgrade.Upgrade(c.Writer, c.Request, nil); err != nil { return } // 为了防止忘记关闭WebSocket连接,使用defer defer func(conn *websocket.Conn) { if err = conn.Close(); err != nil { return } }(conn) // 这里只处理客户端传什么就返回什么 for { // 定义数据变量 var ( msgType int // 数据类型 data []byte // 数据 errMsg error //错误信息 ) // 接收数据 if msgType, data, errMsg = conn.ReadMessage(); errMsg != nil { break } // 响应数据 if errMsg = conn.WriteMessage(msgType,data); errMsg != nil{ break } } }
将
main
函数调整func main() { r := gin.Default() r.GET("/test", handler) err := r.Run(":1234") if err != nil { return } }
完整代码如下
package main
import (
"github.com/gin-gonic/gin"
"golang.org/websocket"
"net/http"
)
var (
upgrade = &websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true
},
}
)
func handler(c *gin.Context) {
// 定义两个变量,其一就是*websocket.Conn,其二就是error
var (
conn *websocket.Conn
err error
)
// 赋值变量,这里就用到了前面定义的upgrade
// conn这结构体内有许多功能,可以都尝试一下,当一般常使用:
// conn.ReadMessage()
// conn.WriteMessage()
// conn.Close()
if conn, err = upgrade.Upgrade(c.Writer, c.Request, nil); err != nil {
return
}
// 为了防止忘记关闭WebSocket连接,使用defer
defer func(conn *websocket.Conn) {
if err = conn.Close(); err != nil {
return
}
}(conn)
// 这里只处理客户端传什么就返回什么
for {
// 定义数据变量
var (
msgType int // 数据类型
data []byte // 数据
errMsg error //错误信息
)
// 接收数据
if msgType, data, errMsg = conn.ReadMessage(); errMsg != nil {
break
}
// 响应数据
if errMsg = conn.WriteMessage(msgType,data); errMsg != nil{
break
}
}
}
func main() {
r := gin.Default()
r.GET("/test", handler)
err := r.Run(":1234")
if err != nil {
return
}
}