feat(common): 添加 WebSocket 支持
- 在 ClientData 结构中添加 WsCodec 字段 - 实现 WebSocket 升级和消息处理逻辑 - 添加 WebSocket 相关的依赖包
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user