2021-11-11 15:56:02 +08:00
|
|
|
|
package ws
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"encoding/json"
|
2021-11-12 14:35:34 +08:00
|
|
|
|
"mayfly-go/base/global"
|
2021-11-11 15:56:02 +08:00
|
|
|
|
"net/http"
|
2021-11-12 14:35:34 +08:00
|
|
|
|
"time"
|
2021-11-11 15:56:02 +08:00
|
|
|
|
|
|
|
|
|
|
"github.com/gorilla/websocket"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
var Upgrader = websocket.Upgrader{
|
|
|
|
|
|
ReadBufferSize: 1024,
|
|
|
|
|
|
WriteBufferSize: 1024 * 1024 * 10,
|
|
|
|
|
|
CheckOrigin: func(r *http.Request) bool {
|
|
|
|
|
|
return true
|
|
|
|
|
|
},
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var conns = make(map[uint64]*websocket.Conn, 100)
|
|
|
|
|
|
|
2021-11-12 14:35:34 +08:00
|
|
|
|
func init() {
|
|
|
|
|
|
checkConn()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-11-11 15:56:02 +08:00
|
|
|
|
// 放置ws连接
|
|
|
|
|
|
func Put(userId uint64, conn *websocket.Conn) {
|
2021-11-18 14:40:12 +08:00
|
|
|
|
existConn := conns[userId]
|
|
|
|
|
|
if existConn != nil {
|
|
|
|
|
|
Delete(userId)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
conn.SetCloseHandler(func(code int, text string) error {
|
|
|
|
|
|
Delete(userId)
|
|
|
|
|
|
return nil
|
|
|
|
|
|
})
|
2021-11-11 15:56:02 +08:00
|
|
|
|
conns[userId] = conn
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-11-12 14:35:34 +08:00
|
|
|
|
func checkConn() {
|
2021-11-18 14:40:12 +08:00
|
|
|
|
heartbeat := time.Duration(60) * time.Second
|
2021-11-12 14:35:34 +08:00
|
|
|
|
tick := time.NewTicker(heartbeat)
|
|
|
|
|
|
go func() {
|
|
|
|
|
|
for range tick.C {
|
|
|
|
|
|
// 遍历所有连接,ping失败的则删除掉
|
|
|
|
|
|
for uid, conn := range conns {
|
|
|
|
|
|
err := conn.WriteControl(websocket.PingMessage, []byte("ping"), time.Now().Add(heartbeat/2))
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
Delete(uid)
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 删除ws连接
|
|
|
|
|
|
func Delete(userid uint64) {
|
2021-11-18 14:40:12 +08:00
|
|
|
|
global.Log.Info("移除websocket连接:uid = ", userid)
|
2021-11-12 14:35:34 +08:00
|
|
|
|
conn := conns[userid]
|
|
|
|
|
|
if conn != nil {
|
|
|
|
|
|
conn.Close()
|
|
|
|
|
|
delete(conns, userid)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-11-11 15:56:02 +08:00
|
|
|
|
// 对指定用户发送消息
|
|
|
|
|
|
func SendMsg(userId uint64, msg *Msg) {
|
|
|
|
|
|
conn := conns[userId]
|
|
|
|
|
|
if conn != nil {
|
|
|
|
|
|
bytes, _ := json.Marshal(msg)
|
|
|
|
|
|
conn.WriteMessage(websocket.TextMessage, bytes)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|