feat(common): 添加 WebSocket 支持

- 在 ClientData 结构中添加 WsCodec 字段
- 实现 WebSocket 升级和消息处理逻辑
- 添加 WebSocket 相关的依赖包
This commit is contained in:
2025-07-11 21:04:28 +08:00
parent c1065062fb
commit 6b639b8826
5 changed files with 236 additions and 6 deletions

View File

@@ -2,21 +2,26 @@ package socket
import (
"context"
"fmt"
"log"
"sync/atomic"
"time"
"blazing/common/data/entity"
"github.com/gobwas/ws/wsutil"
"github.com/gogf/gf/v2/os/glog"
"github.com/panjf2000/gnet/v2"
"github.com/panjf2000/gnet/v2/pkg/logging"
)
func (s *Server) Boot() error {
// go s.bootws()
err := gnet.Run(s, s.network+"://"+s.addr,
gnet.WithMulticore(true),
gnet.WithTicker(true),
// gnet.WithReusePort(true),
// gnet.WithReuseAddr(true),
gnet.WithSocketRecvBuffer(s.bufferSize))
if err != nil {
return err
@@ -64,19 +69,60 @@ func (s *Server) OnBoot(eng gnet.Engine) gnet.Action {
return gnet.None
}
func (s *Server) OnOpen(_ gnet.Conn) (out []byte, action gnet.Action) {
func (s *Server) OnOpen(conn gnet.Conn) (out []byte, action gnet.Action) {
if conn.Context() == nil {
conn.SetContext(entity.NewClientData()) //注入data
}
atomic.AddInt64(&s.connected, 1)
return nil, gnet.None
}
func (s *Server) OnTraffic(conn gnet.Conn) (action gnet.Action) {
if conn.Context() == nil {
conn.SetContext(entity.NewClientData()) //注入data
func (s *Server) OnTraffic(c gnet.Conn) (action gnet.Action) {
if s.network != "tcp" {
return gnet.Close
}
if s.network == "tcp" {
return s.handleTcp(conn)
ws := c.Context().(*entity.ClientData).Getwsmsg()
tt, len1 := ws.ReadBufferBytes(c)
if tt == gnet.Close {
return gnet.Close
}
ok, action := ws.Upgrade(c)
if !ok {
s.handleTcp(c)
return gnet.None
} else {
fmt.Println(ws.Buf.Bytes())
c.Read(make([]byte, len1))
}
if ws.Buf.Len() <= 0 {
return gnet.None
}
messages, err := ws.Decode(c)
if err != nil {
return gnet.Close
}
if messages == nil {
return
}
for _, message := range messages {
msgLen := len(message.Payload)
if msgLen > 128 {
logging.Infof("conn[%v] receive [op=%v] [msg=%v..., len=%d]", c.RemoteAddr().String(), message.OpCode, string(message.Payload[:128]), len(message.Payload))
} else {
logging.Infof("conn[%v] receive [op=%v] [msg=%v, len=%d]", c.RemoteAddr().String(), message.OpCode, string(message.Payload), len(message.Payload))
}
// This is the echo server
err = wsutil.WriteServerMessage(c, message.OpCode, message.Payload)
if err != nil {
logging.Infof("conn[%v] [err=%v]", c.RemoteAddr().String(), err.Error())
return gnet.Close
}
}
return gnet.None