feat(socket): 实现 WebSocket 代理功能

- 新增 WebSocket 中间件,支持连接到指定端口的 TCP 服务器
- 在 ServerEvent 中添加错误日志输出
- 优化 ClientData 解析逻辑,增加类型断言
- 更新 index.html,添加 socket 代理配置
This commit is contained in:
2025-07-10 01:01:43 +08:00
parent c76c2f4139
commit cd2a5db9d2
5 changed files with 111 additions and 6 deletions

View File

@@ -1,9 +1,16 @@
package middleware
import (
"fmt"
"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"
)
@@ -11,10 +18,51 @@ 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) {
@@ -25,7 +73,20 @@ func (c *Handler) OnPing(socket *gws.Conn, payload []byte) {
func (c *Handler) OnPong(socket *gws.Conn, payload []byte) {}
func (c *Handler) OnMessage(socket *gws.Conn, gwsmessage *gws.Message) {
fmt.Println(gwsmessage.Bytes())
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()
}
}