From cd2a5db9d28a1e89c2b200a0f26d215dcc944348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <1@72wo.cn> Date: Thu, 10 Jul 2025 01:01:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(socket):=20=E5=AE=9E=E7=8E=B0=20WebSocket?= =?UTF-8?q?=20=E4=BB=A3=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 WebSocket 中间件,支持连接到指定端口的 TCP 服务器 - 在 ServerEvent 中添加错误日志输出 - 优化 ClientData 解析逻辑,增加类型断言 - 更新 index.html,添加 socket 代理配置 --- common/socket/ServerEvent.go | 7 ++- modules/base/middleware/middleware.go | 9 +++- modules/base/middleware/websocket.go | 65 +++++++++++++++++++++++++- public/index.html | 36 +++++++++++++- public/login/Login.swf | Bin 536673 -> 3255333 bytes 5 files changed, 111 insertions(+), 6 deletions(-) diff --git a/common/socket/ServerEvent.go b/common/socket/ServerEvent.go index 9423b41c..570780d1 100644 --- a/common/socket/ServerEvent.go +++ b/common/socket/ServerEvent.go @@ -22,6 +22,7 @@ func (s *Server) Boot() error { return err } // err := gnet.Run(s, s.network+"://"+s.addr, gnet.WithMulticore(s.multicore)) + glog.Debug(context.Background(), "server exits with error: %v", err) // logging.Infof("server exits with error: %v", err) return nil } @@ -36,7 +37,11 @@ func (s *Server) Stop() error { func (s *Server) OnClose(c gnet.Conn, _ error) (action gnet.Action) { atomic.AddInt64(&s.connected, -1) //logging.Infof("conn[%v] disconnected", c.RemoteAddr().String()) - v := c.Context().(*entity.ClientData) + v, ok := c.Context().(*entity.ClientData) + if !ok { + return + + } t := v.GetPlayer() if t != nil { glog.Debug(context.Background(), t.UserID, "断开连接") diff --git a/modules/base/middleware/middleware.go b/modules/base/middleware/middleware.go index 27caff8f..b0a6f4e5 100644 --- a/modules/base/middleware/middleware.go +++ b/modules/base/middleware/middleware.go @@ -7,6 +7,7 @@ import ( "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/util/gconv" "github.com/lxzan/gws" ) @@ -41,9 +42,13 @@ func init() { if config.Config.Middleware.Log.Enable { g.Server().BindMiddleware("/admin/*", BaseLog) } - g.Server().BindHandler("/ws", func(r *ghttp.Request) { + g.Server().BindHandler("/ws/*", func(r *ghttp.Request) { + urls := r.URL.Query().Get("port") + fmt.Println(urls) + tt := new(Handler) - upgrader := gws.NewUpgrader(new(Handler), &gws.ServerOption{ + tt.port = gconv.Int(urls) + upgrader := gws.NewUpgrader(tt, &gws.ServerOption{ //CompressEnabled: true, // 在querystring里面传入用户名 diff --git a/modules/base/middleware/websocket.go b/modules/base/middleware/websocket.go index dde53a44..6eb9e26f 100644 --- a/modules/base/middleware/websocket.go +++ b/modules/base/middleware/websocket.go @@ -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() + + } } diff --git a/public/index.html b/public/index.html index 7dc3e795..c056aa96 100644 --- a/public/index.html +++ b/public/index.html @@ -23,19 +23,52 @@ flex-shrink: 0; /* 防止播放器被压缩 */ width: 100%; height: 100%; + } + :root { + --logo-display: block; /* 默认值,可以是 inline, flex, none 等 */ + --logo-width: 150px; /* Logo 宽度 */ + --logo-height: auto; /* Logo 高度,保持比例 */ +} +
- + diff --git a/public/login/Login.swf b/public/login/Login.swf index 57ab4b5fe4004fbe08002ac5cb09e4abdfbcf6b0..411c8f565bbd4fdf711e9bd9f4899e2523d75fe3 100644 GIT binary patch delta 3045611 zcmV(tK8>ahCbGZ_
zeV72?E5RHgxsGnlc9JKMU$43oG59`zte^>9Gz{>}57z@P;oC96_8+% 76YZl^~RuSRBpKcOw=
zW$O;0+KMHPxo=xbPyzMsXtXrjn6QSSV+b{g&KtodYyvGH`WP2rWH&6Nntw$XJRm=R
zkpoMYZ6AB_WB#*vjMWeRXCXLyYyHVWhU)X&iN7mJjLQ0Fru7R)qOasAU}0u| 9ve6StIVXbcinJT~Ys=m?UUWQlZtm^IO`{vwP{xMau9+wU!
z>eiSOB}%T6&C-v&-87XO!-DM!@wl|{8& fR4-uXk7@@P9MQNQ&1zB^ZLpUQykCgR<1(;|yE)_>41_TK$-v0Vo?D9qt
zQcvuSe{|cg9~kT|;>L4t@0A-#3K4-CL~->k`aMEoZY(-UrbFAp&(IeM>jEaqe`&41
zWaQ!tD2F-a3YxN|2$WnN }1_)VE<`3gu?`JT@TnsZx^y5(qk)IcW9{#
zSBu=ZbHodMKmaCo<_ %6(rOi}^U*2EwJ*rdVPd{M8O?Z1FN=tNiv*sJ_uf1};XBer{xQ+UI
z7BV8$xR1C@jFh-5P6&@+Gt=w>Lg1r*{_EB!Q!P2J@m5VLkPSk!$>yC`Xmtbd4+s#e
zMxZ7RE(CLqwXx#Y^TE=MfV}`GpotoNpa3mBEPvHV1*lh~SpYQ+1M*=SyOp&(O%)8@
z84-eFsO!?#8nD>;|-JShvTsHUZbLq|Il&0XSGqA;gV6+Qd7K&8kL!EgAN-ysiT|
zurww}RrVJIBta~`pnE!Z1TKMem)lY%UCX<^XM
g3S5Ik=o~x#7xrx$Y;i*TZsGdJFLWw@6X>
G*iPJnBUUcwPQjGb{J6C5t^n6LVflp|jPZ5KCC#pQN08w)MN7Db~g`*3o9gQFe
zLWviDW)~y6%wyV+vv7%u48tWz)sL)C@KBSn;cES=RWE(W#s_M(qh9a<{#f#DYWI*C
z>X$a1gpA)@RI$-yJtp04v?S+yP^GI-YJM|vmsY{AaQTJ1mRPPiQxjF{`KS&xKr-5L
z&euPX36WXs|5jX<&dL4d4wZ)KB_bvEA7y)y#Z?D
Cj&gw+joLR0JV+0*A&TMoyWJ$g_V4L_{ihO2e+au1rY`daE_LnM)W+S=7aj}^
zW0hZsuC`P0ds{39<){y|Dv3*w{OwWjXSKiG(dwWRgSVE`P4yB39>TGzynbBpW`{#Q
zOF9!yvWRh^^Hb*uHhbrS`QzwAVlz>8S#e_O-t~x~1a>{>n$NlczU40U-L5K8v!I8H
zbpNG@e^k
Sw6B>CcllQrCEa{pT~Z7o1nE|ow(X8@1r9ke@_lmT`s
zW0~~M0bn*r7{Y1~Va7U$tyNoKy?aDP^HHxiSFGamV!a^4nqGm^a6jZb3*yW=^TUBS
z`Xl7C*M+LpR3i?df$!JbUh+-wjHYr0Fse^Wo3O0PW=!aumHQzje{)IglDOFTyH(Z?
zK35Rp!*R