Websocket 的适配器实现
在使用 weboscket 客户端发送数据的时候,遵循以下数据协议
请求json
{
"cmd":"register",
"seqno":"unique_string",
"data": {}
}
- cmd 表示命令名,对应 cs 的路由
- seqno 表示该请求的唯一标识,在响应中会原样返回
- data 表示请求数据,可以是任意值,如 string, number, object, array, null
响应
{
"cmd":"register",
"seqno":"unique_string",
"code": 0,
"msg":"ok",
"data": {}
}
- cmd 表示命令名,对应请求的 cmd
- seqno 表示该请求的唯一标识,对应请求的 seqno
- code 响应状态码,不等于 0 表示异常, -1 表示不支持请求的cmd,其他业务码根据业务适应
- msg 响应说明,只在code不等于 0 时才有意义
- data 表示响应数据,可能是任意值,如 string, number, object, array, null
这是该实现的数据协议,如果想要自己定制协议,可参考该实现重新自己定义实现
- 实例化完成后挂载到路由中
- 生成 cs 实例
import (
"net/http"
"github.com/eyasliu/cs/xwebsocket"
)
func main() {
ws := xwebsocket.New()
http.Handler("/ws", ws.Handler) // 挂载到路由中
srv := ws.Srv()
go srv.Run()
log.Fatal(http.ListenAndServe(":8080", nil))
}
实例化的 WS
实现了 net/http
标准库的 http.Handler
接口,ws.Handler
实现了 http.HandlerFunc
,所以可以方便的用在其他 web 框架中,如
GoFrame
package main
import (
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/eyasliu/cs/xwebsocket"
)
func main() {
ws := xwebsocket.New()
srv := ws.Srv()
s := g.Server()
s.BindHandler("/ws", ghttp.WrapH(ws))
s.BindHandler("/ws2", ghttp.WrapF(ws.Handler))
go srv.Run()
s.Run()
}
Gin
package main
import (
"github.com/gin-gonic/gin"
"github.com/eyasliu/cs/xwebsocket"
)
func main() {
ws := xwebsocket.New()
srv := ws.Srv()
r := gin.Default()
r.GET("/ws", gin.WrapH(ws))
r.GET("/ws2", gin.WrapF(ws.Handler))
go srv.Run()
r.APIRun(":8100")
}
Echo
package main
import (
"github.com/labstack/echo/v4"
"github.com/eyasliu/cs/xwebsocket"
)
func main() {
ws := xwebsocket.New()
srv := ws.Srv()
e := echo.New()
e.GET("/ws", func(c *echo.Context) {
ws.Handler(c.Response(), c.Request())
})
go srv.Run()
e.Star(":8100")
}