Files
bl/modules/base/middleware/websocket.go
昔念 cd2a5db9d2 feat(socket): 实现 WebSocket 代理功能
- 新增 WebSocket 中间件,支持连接到指定端口的 TCP 服务器
- 在 ServerEvent 中添加错误日志输出
- 优化 ClientData 解析逻辑,增加类型断言
- 更新 index.html,添加 socket 代理配置
2025-07-10 01:01:43 +08:00

133 lines
3.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package middleware
import (
"bufio"
"context"
"encoding/binary"
"io"
"log"
"net"
"time"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/util/gconv"
"github.com/lxzan/gws"
)
const PingInterval = 10 * time.Second
type Handler struct {
gws.BuiltinEventHandler
port int
target net.Conn
}
func (c *Handler) OnOpen(socket *gws.Conn) {
target, err := net.Dial("tcp", "127.0.0.1:"+gconv.String(c.port))
if err != nil {
glog.Debug(context.Background(), "连接失败")
}
c.target = target
//errChan := make(chan error, 2)
go func(conn net.Conn, socket *gws.Conn) {
reader := bufio.NewReader(conn)
LOOP:
for {
// select {
// default:
packlen, err := reader.Peek(4)
if err != nil {
break LOOP
}
length := int32(binary.BigEndian.Uint32(packlen))
data := make([]byte, length)
io.ReadFull(reader, data)
//pack_Ver := data[4] //因为包体已经解析所以这里直接取0
// var pack = make([]byte, length)
socket.WriteMessage(gws.OpcodeBinary, data)
//t.event.RecvHandler(pack)
// client.OnReceiveBase(client, pack, length)
}
}(c.target, socket)
//err = <-errChan
if err != io.EOF {
log.Println("proxy error:", err)
}
}
func (c *Handler) OnPing(socket *gws.Conn, payload []byte) {
_ = socket.SetDeadline(time.Now().Add(2 * PingInterval))
_ = socket.WritePong(nil)
}
func (c *Handler) OnPong(socket *gws.Conn, payload []byte) {}
func (c *Handler) OnMessage(socket *gws.Conn, gwsmessage *gws.Message) {
if c.target != nil {
c.target.Write(gwsmessage.Bytes())
}
//fmt.Println(gwsmessage.Bytes())
}
func (c *Handler) OnClose(socket *gws.Conn, err error) {
glog.Debug(context.Background(), "断开连接")
if c.target != nil {
c.target.Close()
}
}
// RemoveSocket 移除WebSocket连接
func messeunpack(id int64, x []byte) {
// json := gjson.ParseBytes(x)
// json.ForEach(func(key, value gjson.Result) bool {
// fmt.Println(key, value)
// numeric := regexp.MustCompile(`\d`).MatchString(value.String())
// var ob int
// if numeric { //如果正确 则使用常量
// } else { //如果错误,则使用变量,即从数据库查询常量定义值是多少
// }
// work.User_script(uint(id), strings.Trim(message.Data.String(), " "))
// // switch s:=value.String() {
// // case regexp.MustCompile(`\d`).MatchString(s):
// // }
// return true
// })
// json.Get("1").String()
// var ob int
// numeric := regexp.MustCompile(`\d`).MatchString(json.Get("1").String())
// if numeric { //如果正确 则使用常量
// ob, _ = strconv.Atoi(json.Get("1").String())
// } else { //如果错误,则使用变量,即从数据库查询常量定义值是多少
// ob, _ = strconv.Atoi(json.Get("1").String())
// }
// switch ob {
// case 1: //发包函数
// work.User_script(uint(id), strings.Trim(message.Data.String(), " "))
// }
// Go 1.9.7 onwards only.
}