83 lines
2.1 KiB
Go
83 lines
2.1 KiB
Go
/*
|
|
* @desc:websocket路由
|
|
* @company:云南奇讯科技有限公司
|
|
* @Author: yixiaohu<yxh669@qq.com>
|
|
* @Date: 2023/11/30 15:06
|
|
*/
|
|
|
|
package router
|
|
|
|
import (
|
|
"context"
|
|
"github.com/gogf/gf/v2/net/ghttp"
|
|
"github.com/gogf/gf/v2/os/gtime"
|
|
"github.com/gogf/gf/v2/util/guid"
|
|
"github.com/gorilla/websocket"
|
|
commonController "github.com/tiger1103/gfast/v3/internal/app/common/controller"
|
|
"github.com/tiger1103/gfast/v3/internal/app/system/service"
|
|
"github.com/tiger1103/gfast/v3/library/libUtils"
|
|
"github.com/tiger1103/gfast/v3/library/libWebsocket"
|
|
"net/http"
|
|
)
|
|
|
|
var R = new(Router)
|
|
|
|
type Router struct{}
|
|
|
|
// WsPage ws入口
|
|
func WsPage(r *ghttp.Request) {
|
|
upGrader := websocket.Upgrader{
|
|
ReadBufferSize: 1024,
|
|
WriteBufferSize: 1024,
|
|
CheckOrigin: func(r *http.Request) bool {
|
|
return true
|
|
},
|
|
}
|
|
conn, err := upGrader.Upgrade(r.Response.Writer, r.Request, nil)
|
|
if err != nil {
|
|
return
|
|
}
|
|
currentTime := uint64(gtime.Now().Unix())
|
|
client := NewClient(r, conn, currentTime)
|
|
go client.Read()
|
|
go client.Write()
|
|
// 用户连接事件
|
|
libWebsocket.Register(client)
|
|
}
|
|
|
|
// NewClient 初始化
|
|
func NewClient(r *ghttp.Request, socket *websocket.Conn, firstTime uint64) (client *libWebsocket.Client) {
|
|
client = &libWebsocket.Client{
|
|
Addr: socket.RemoteAddr().String(),
|
|
ID: guid.S(),
|
|
Socket: socket,
|
|
Send: make(chan *libWebsocket.WResponse, 100),
|
|
SendClose: false,
|
|
CloseSignal: make(chan struct{}, 1),
|
|
FirstTime: firstTime,
|
|
HeartbeatTime: firstTime,
|
|
User: service.Context().GetLoginUser(r.Context()),
|
|
IP: libUtils.GetClientIp(r.Context()),
|
|
UserAgent: r.UserAgent(),
|
|
}
|
|
return
|
|
}
|
|
|
|
func (router *Router) BindController(ctx context.Context, group *ghttp.RouterGroup) {
|
|
group.Group("/websocket", func(group *ghttp.RouterGroup) {
|
|
//登录验证拦截
|
|
service.GfToken().Middleware(group)
|
|
//context拦截器
|
|
group.Middleware(service.Middleware().Ctx)
|
|
|
|
group.GET("/", WsPage)
|
|
})
|
|
// 启动websocket监听
|
|
libWebsocket.Start()
|
|
|
|
// 注册消息路由
|
|
libWebsocket.RegisterMsg(libWebsocket.EventHandlers{
|
|
"ping": commonController.Ping.Ping, // 心跳
|
|
})
|
|
}
|