Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
366ddb45ea | ||
|
|
09a9f14a29 | ||
|
|
e0afb55bb2 |
@@ -111,8 +111,12 @@ func (s *Excel) RemoveComments(list []interface{}, json []string) []interface{}
|
|||||||
// 遍历当前元素的每个键值对
|
// 遍历当前元素的每个键值对
|
||||||
for _, v3 := range v2.(g.Map) {
|
for _, v3 := range v2.(g.Map) {
|
||||||
// 如果字符串中存在//则跳过不写入temp
|
// 如果字符串中存在//则跳过不写入temp
|
||||||
if gstr.Contains(gconv.String(v3), "//") {
|
//if gstr.Contains(gconv.String(v3), "//") {
|
||||||
//delKey = append(delKey, k2)
|
// //delKey = append(delKey, k2)
|
||||||
|
// add = false
|
||||||
|
// break
|
||||||
|
//}
|
||||||
|
if strings.HasPrefix(gconv.String(v3), "//") {
|
||||||
add = false
|
add = false
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,26 @@
|
|||||||
package websocket
|
package websocket
|
||||||
|
|
||||||
import "context"
|
|
||||||
|
|
||||||
// 定义一个处理方法的类型
|
// 定义一个处理方法的类型
|
||||||
type Handler func(ctx context.Context, req any) (err error)
|
type Handler func(conn *WebsocketData, req any) (err error)
|
||||||
|
type OnConnectHandler func(conn *WebsocketData)
|
||||||
|
|
||||||
// 路由器的处理映射
|
// 路由器的处理映射
|
||||||
var (
|
var (
|
||||||
handlers = make(map[int]Handler)
|
handlers = make(map[int]Handler)
|
||||||
|
OnConnectHandlers = make([]OnConnectHandler, 0)
|
||||||
|
OnCloseHandlers = make([]OnConnectHandler, 0)
|
||||||
)
|
)
|
||||||
|
|
||||||
// 注册方法,将某个消息路由器ID和对应的处理方法关联起来
|
// 注册方法,将某个消息路由器ID和对应的处理方法关联起来
|
||||||
func (s *SocketV1) RegisterRouter(cmd int, handler Handler) {
|
func (s *SocketV1) RegisterRouter(cmd int, handler Handler) {
|
||||||
handlers[cmd] = handler
|
handlers[cmd] = handler
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//注册方法,讲长连接登陆方法进行注册
|
||||||
|
func (s *SocketV1) RegisterOnConnect(_func OnConnectHandler) {
|
||||||
|
OnConnectHandlers = append(OnConnectHandlers, _func)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SocketV1) RegisterOnClose(_func OnConnectHandler) {
|
||||||
|
OnCloseHandlers = append(OnCloseHandlers, _func)
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,16 +4,18 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"github.com/gogf/gf/v2/container/gmap"
|
"github.com/gogf/gf/v2/container/gmap"
|
||||||
"github.com/gogf/gf/v2/frame/g"
|
"github.com/gogf/gf/v2/frame/g"
|
||||||
"github.com/gogf/gf/v2/os/gctx"
|
"github.com/gogf/gf/v2/net/ghttp"
|
||||||
"github.com/gogf/gf/v2/os/glog"
|
"github.com/gogf/gf/v2/os/glog"
|
||||||
"github.com/gogf/gf/v2/util/gconv"
|
"github.com/gogf/gf/v2/util/gconv"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
"github.com/gogf/gf/v2/net/ghttp"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type SocketV1 struct{}
|
type SocketV1 struct {
|
||||||
|
Type int `json:"type"`
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
//ctx = gctx.New()
|
//ctx = gctx.New()
|
||||||
@@ -31,7 +33,9 @@ type WebsocketData struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NewV1() *SocketV1 {
|
func NewV1() *SocketV1 {
|
||||||
return &SocketV1{}
|
return &SocketV1{
|
||||||
|
Type: 1,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type SocketInterface interface {
|
type SocketInterface interface {
|
||||||
@@ -79,7 +83,6 @@ func (s *SocketV1) OnConnect(ctx context.Context, conn *websocket.Conn) {
|
|||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
id, _ := uuid.NewUUID()
|
id, _ := uuid.NewUUID()
|
||||||
ip := conn.RemoteAddr().String()
|
ip := conn.RemoteAddr().String()
|
||||||
|
|
||||||
data := &WebsocketData{
|
data := &WebsocketData{
|
||||||
Uuid: id,
|
Uuid: id,
|
||||||
Ws: conn,
|
Ws: conn,
|
||||||
@@ -92,6 +95,11 @@ func (s *SocketV1) OnConnect(ctx context.Context, conn *websocket.Conn) {
|
|||||||
//to := fmt.Sprintf("创建连接:%v,ip=%v", id, ip)
|
//to := fmt.Sprintf("创建连接:%v,ip=%v", id, ip)
|
||||||
//s.Send(id, []byte(to))
|
//s.Send(id, []byte(to))
|
||||||
|
|
||||||
|
//用户登录钩子执行
|
||||||
|
for _, connect := range OnConnectHandlers {
|
||||||
|
connect(data)
|
||||||
|
}
|
||||||
|
|
||||||
for {
|
for {
|
||||||
//进入当前连接线程拥堵
|
//进入当前连接线程拥堵
|
||||||
msgType, msg, err := conn.ReadMessage()
|
msgType, msg, err := conn.ReadMessage()
|
||||||
@@ -102,7 +110,7 @@ func (s *SocketV1) OnConnect(ctx context.Context, conn *websocket.Conn) {
|
|||||||
s.OnMessage(m.Get(id).(*WebsocketData), msg, msgType)
|
s.OnMessage(m.Get(id).(*WebsocketData), msg, msgType)
|
||||||
}
|
}
|
||||||
//关闭连接触发
|
//关闭连接触发
|
||||||
s.OnClose(id, conn)
|
s.OnClose(data)
|
||||||
g.Log().Debugf(ctx, "断开连接:uuid=%v,ip=%v", id, ip)
|
g.Log().Debugf(ctx, "断开连接:uuid=%v,ip=%v", id, ip)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,21 +121,23 @@ func (s *SocketV1) OnConnect(ctx context.Context, conn *websocket.Conn) {
|
|||||||
// @param msg
|
// @param msg
|
||||||
// @param msgType
|
// @param msgType
|
||||||
func (s *SocketV1) OnMessage(conn *WebsocketData, req []byte, msgType int) {
|
func (s *SocketV1) OnMessage(conn *WebsocketData, req []byte, msgType int) {
|
||||||
|
s.Type = msgType
|
||||||
//g.Log().Debugf(ctx, "收到消息:%v,type=%v,conn=%v", string(req), msgType, conn)
|
//g.Log().Debugf(ctx, "收到消息:%v,type=%v,conn=%v", string(req), msgType, conn)
|
||||||
//s.Send(conn.Uuid, msg)
|
//s.Send(conn.Uuid, msg)
|
||||||
//s.SendAll(msg)
|
//s.SendAll(msg)
|
||||||
msgStr := string(req)
|
//msgStr := string(req)
|
||||||
msg := msgStr[8:]
|
msg := req[8:]
|
||||||
cmd := gconv.Int(msgStr[:8])
|
cmd := gconv.Int(req[:8])
|
||||||
//GetRouter(cmd, conn.Uid, msg)
|
//GetRouter(cmd, conn.Uid, msg)
|
||||||
handler, exist := handlers[cmd]
|
handler, exist := handlers[cmd]
|
||||||
if exist {
|
if exist {
|
||||||
//匹配上路由器
|
//匹配上路由器
|
||||||
handler(conn.Ctx, msg)
|
err := handler(conn, msg)
|
||||||
|
g.Log().Error(conn.Ctx, err)
|
||||||
} else {
|
} else {
|
||||||
//fmt.Println("未注册的路由器ID:", cmd)
|
//fmt.Println("未注册的路由器ID:", cmd)
|
||||||
s.Send(conn.Uuid, []byte("未注册的协议号:"+msgStr[:8]))
|
s.Send(conn.Uuid, []byte("未注册的协议号:"+strconv.Itoa(cmd)))
|
||||||
s.OnClose(conn.Uuid, conn.Ws)
|
s.OnClose(conn)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,7 +156,7 @@ func (s *SocketV1) Send(id uuid.UUID, data []byte) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
conn := m.Get(id).(*WebsocketData)
|
conn := m.Get(id).(*WebsocketData)
|
||||||
conn.Ws.WriteMessage(1, data)
|
conn.Ws.WriteMessage(s.Type, data)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -156,7 +166,8 @@ func (s *SocketV1) SendAll(data []byte) {
|
|||||||
m.Iterator(func(k interface{}, v interface{}) bool {
|
m.Iterator(func(k interface{}, v interface{}) bool {
|
||||||
//fmt.Printf("%v:%v ", k, v)
|
//fmt.Printf("%v:%v ", k, v)
|
||||||
conn := v.(*WebsocketData)
|
conn := v.(*WebsocketData)
|
||||||
conn.Ws.WriteMessage(1, data)
|
conn.Ws.WriteMessage(s.Type, data)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -166,14 +177,19 @@ func (s *SocketV1) SendAll(data []byte) {
|
|||||||
// @Description:
|
// @Description:
|
||||||
// @receiver s
|
// @receiver s
|
||||||
// @param conn
|
// @param conn
|
||||||
func (s *SocketV1) OnClose(id uuid.UUID, conn *websocket.Conn) {
|
func (s *SocketV1) OnClose(conn *WebsocketData) {
|
||||||
// 在此处编写断开连接后的处理逻辑
|
// 在此处编写断开连接后的处理逻辑
|
||||||
g.Log().Debugf(gctx.New(), "WebSocket connection from %s has been closed.", conn.RemoteAddr())
|
//g.Log().Debugf(gctx.New(), "WebSocket connection from %s has been closed.", conn.RemoteAddr())
|
||||||
|
|
||||||
|
//用户登录钩子执行
|
||||||
|
for _, connect := range OnCloseHandlers {
|
||||||
|
connect(conn)
|
||||||
|
}
|
||||||
|
|
||||||
// 可能的后续操作:
|
// 可能的后续操作:
|
||||||
// 1. 更新连接状态或从连接池移除
|
// 1. 更新连接状态或从连接池移除
|
||||||
// 2. 发送通知或清理关联资源
|
// 2. 发送通知或清理关联资源
|
||||||
// 3. 执行特定于业务的断开处理
|
// 3. 执行特定于业务的断开处理
|
||||||
m.Remove(id)
|
m.Remove(conn.Uuid)
|
||||||
conn.Close()
|
conn.Ws.Close()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,6 +53,44 @@ func (m *randMod) RandomAll(data map[int]int, n int) []int {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func RandomAll[t Any](data map[t]int, n int) []t {
|
||||||
|
if n > len(data) {
|
||||||
|
n = len(data)
|
||||||
|
}
|
||||||
|
rand.Seed(time.Now().UnixNano())
|
||||||
|
// 复制权重映射,避免修改原始数据
|
||||||
|
remainingWeights := make(map[t]int)
|
||||||
|
for k, v := range data {
|
||||||
|
remainingWeights[k] = v
|
||||||
|
}
|
||||||
|
result := make([]t, 0, n)
|
||||||
|
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
totalWeight := 0
|
||||||
|
// 计算剩余元素的总权重
|
||||||
|
for _, weight := range remainingWeights {
|
||||||
|
totalWeight += weight
|
||||||
|
}
|
||||||
|
if totalWeight == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
// 生成一个 0 到总权重之间的随机数
|
||||||
|
randomNum := rand.Intn(totalWeight)
|
||||||
|
currentWeight := 0
|
||||||
|
for key, weight := range remainingWeights {
|
||||||
|
currentWeight += weight
|
||||||
|
if randomNum < currentWeight {
|
||||||
|
// 将选中的元素添加到结果切片中
|
||||||
|
result = append(result, key)
|
||||||
|
// 从剩余权重映射中移除选中的元素
|
||||||
|
delete(remainingWeights, key)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
// RandByArrInt 根据传入的 interface 切片中的整数值按权重随机返回一个索引
|
// RandByArrInt 根据传入的 interface 切片中的整数值按权重随机返回一个索引
|
||||||
// 参数 s: 一个包含整数的 interface 切片,切片中的每个元素代表一个权重
|
// 参数 s: 一个包含整数的 interface 切片,切片中的每个元素代表一个权重
|
||||||
// 返回值: 随机选中的元素的索引
|
// 返回值: 随机选中的元素的索引
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ func (m *timeMod) GetDailyTimeList(time1 time.Time, time2 time.Time) (timeList [
|
|||||||
|
|
||||||
// ExcelTime2Time excel时间转时间 (12/10/24 02:03转为时间)
|
// ExcelTime2Time excel时间转时间 (12/10/24 02:03转为时间)
|
||||||
func (m *timeMod) ExcelTime2Time(excelTime string) time.Time {
|
func (m *timeMod) ExcelTime2Time(excelTime string) time.Time {
|
||||||
layout := "01/02/06 15:04" // 月/日/年(最后两位) 小时:分钟 (24小时制)
|
layout := "1/2/06 15:04" // 月/日/年(最后两位) 小时:分钟 (24小时制)
|
||||||
timeNew, _ := time.ParseInLocation(layout, excelTime, time.Local)
|
timeNew, _ := time.ParseInLocation(layout, excelTime, time.Local)
|
||||||
return timeNew
|
return timeNew
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ type Number interface {
|
|||||||
int | int64 | int32 | int16 | uint64 | uint32 | uint16 | float32 | float64
|
int | int64 | int32 | int16 | uint64 | uint32 | uint16 | float32 | float64
|
||||||
}
|
}
|
||||||
|
|
||||||
//type Any interface {
|
type Any interface {
|
||||||
// interface{} | string | int | int64 | int32 | int16 | uint64 | uint32 | uint16 | float32 | float64
|
string | int | int64 | int32 | int16 | uint64 | uint32 | uint16 | float32 | float64
|
||||||
//}
|
}
|
||||||
|
|
||||||
type toolsInterface interface {
|
type toolsInterface interface {
|
||||||
Load()
|
Load()
|
||||||
|
|||||||
Reference in New Issue
Block a user