This commit is contained in:
2025-06-24 22:09:05 +08:00
parent 32a7a512a2
commit fdac99f11c
38 changed files with 42980 additions and 180 deletions

View File

@@ -2,6 +2,7 @@ package socket
import (
"context"
"log"
"blazing/common/data/entity"
@@ -48,7 +49,9 @@ func (s *Server) OnTraffic(conn gnet.Conn) (action gnet.Action) {
func (s *Server) handleTcp(conn gnet.Conn) (action gnet.Action) {
for {
if !s.discorse {
handle(conn)
}
data, err := s.codec.Decode(conn)
if err != nil {
break
@@ -56,7 +59,7 @@ func (s *Server) handleTcp(conn gnet.Conn) (action gnet.Action) {
//client := conn.RemoteAddr().String()
_ = s.workerPool.Submit(func() {
s.parser(data)
s.parser(conn, data)
})
return gnet.None
@@ -73,12 +76,44 @@ func (s *Server) handleTcp(conn gnet.Conn) (action gnet.Action) {
}
func (s *Server) parser(line []byte) {
func (s *Server) parser(c gnet.Conn, line []byte) {
//todo 这里待实现注入player实体
s.handler.Handle(line)
s.handler.Handle(c, line)
}
func (s *Server) Start() {
err := gnet.Run(s, s.network+"://"+s.addr, gnet.WithMulticore(s.multicore))
logging.Infof("server exits with error: %v", err)
}
// CROSS_DOMAIN 定义跨域策略文件内容
const CROSS_DOMAIN = "<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\x00"
// TEXT 定义跨域请求的文本格式
const TEXT = "<policy-file-request/>\x00"
func handle(c gnet.Conn) {
clientdata := c.Context().(*entity.ClientData)
if clientdata.IsCrossDomain {
return
}
// 读取数据并检查是否为跨域请求
data, err := c.Peek(len(TEXT))
if err != nil {
log.Printf("Error reading cross-domain request: %v", err)
return
}
if string(data) == TEXT { //判断是否是跨域请求
log.Printf("Received cross-domain request from %s", c.RemoteAddr())
// 处理跨域请求
c.Write([]byte(CROSS_DOMAIN))
c.Discard(len(TEXT))
clientdata.IsCrossDomain = true
return
}
//return
}

View File

@@ -18,6 +18,7 @@ type Server struct {
workerPool *goroutine.Pool
codec codec.SocketCodec
handler handler.Handler
discorse bool
}
type Option func(*Server)
@@ -31,6 +32,7 @@ func NewServer(options ...Option) *Server {
workerPool: goroutine.Default(),
bufferSize: 4096, //默认缓冲区大小
multicore: true,
discorse: true,
}
for _, option := range options {
option(server)
@@ -43,7 +45,11 @@ func WithSocketCodec(codec codec.SocketCodec) Option {
u.codec = codec
}
}
func WithCORS() Option {
return func(u *Server) {
u.discorse = false
}
}
func WithSocketHandler(handler handler.Handler) Option {
return func(u *Server) {
u.handler = handler

View File

@@ -1,21 +1,13 @@
package codec
import (
"blazing/common/data/entity"
"encoding/binary"
"errors"
"io"
"log"
"github.com/panjf2000/gnet/v2"
)
// CROSS_DOMAIN 定义跨域策略文件内容
const CROSS_DOMAIN = "<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\x00"
// TEXT 定义跨域请求的文本格式
const TEXT = "<policy-file-request/>\x00"
var ErrIncompletePacket = errors.New("incomplete packet")
// TomeeSocketCodec 协议格式:
@@ -39,31 +31,6 @@ func NewTomeeSocketCodec() *TomeeSocketCodec {
}
func handle(c gnet.Conn) {
clientdata := c.Context().(*entity.ClientData)
if clientdata.IsCrossDomain {
return
}
// 读取数据并检查是否为跨域请求
data, err := c.Peek(len(TEXT))
if err != nil {
log.Printf("Error reading cross-domain request: %v", err)
return
}
if string(data) == TEXT { //判断是否是跨域请求
log.Printf("Received cross-domain request from %s", c.RemoteAddr())
// 处理跨域请求
c.Write([]byte(CROSS_DOMAIN))
c.Discard(len(TEXT))
clientdata.IsCrossDomain = true
return
}
//return
}
func (codec TomeeSocketCodec) Encode(buf []byte) ([]byte, error) {
bodyLen := len(buf)
data := make([]byte, 4+bodyLen)
@@ -78,7 +45,7 @@ func (codec TomeeSocketCodec) Encode(buf []byte) ([]byte, error) {
func (codec TomeeSocketCodec) Decode(c gnet.Conn) ([]byte, error) {
handle(c)
// handle(c)
// 先读取4字节的包长度
lenBuf, err := c.Peek(4)
if err != nil {

View File

@@ -1,6 +1,8 @@
package handler
import "github.com/panjf2000/gnet/v2"
// Handler The handler receive every syslog entry at Handle method
type Handler interface {
Handle([]byte)
Handle(gnet.Conn, []byte)
}

View File

@@ -2,20 +2,23 @@ package handler
import (
"blazing/common/serialize/bytearray"
"github.com/panjf2000/gnet/v2"
)
// TomeeHeader 结构体字段定义
type TomeeHeader struct {
Len uint32 `json:"len"`
Version string `json:"version"`
UserID uint32 `json:"userId"`
Error uint32 `json:"error"`
CMDID uint32 `json:"cmdId"`
Result uint32 `json:"result"`
Data []byte `json:"data"`
UserID uint32 `json:"userId"`
//Error uint32 `json:"error" struc:"[0]pad"`
Result uint32 `json:"result"`
Data []byte `json:"data" struc:"[0]pad"` //组包忽略此字段
}
type TomeeHandler struct {
Callback func(data TomeeHeader)
Callback func(conn gnet.Conn, data TomeeHeader)
}
func NewTomeeHandler() *TomeeHandler {
@@ -23,7 +26,7 @@ func NewTomeeHandler() *TomeeHandler {
}
// Handle entry receiver
func (h *TomeeHandler) Handle(data []byte) { //处理接收到的数据 ,
func (h *TomeeHandler) Handle(c gnet.Conn, data []byte) { //处理接收到的数据 ,
//fmt.Println("接收数据", data)
header := TomeeHeader{}
@@ -37,6 +40,6 @@ func (h *TomeeHandler) Handle(data []byte) { //处理接收到的数据 ,
header.Result, _ = tempdata.ReadUInt32()
header.Data = tempdata.BytesAvailable()
//fmt.Println("接收封包", header)
h.Callback(header)
h.Callback(c, header)
//return header
}